正则表达式
正则表达式:符合一定规则的表达式
作用:用于专门操作字符串。
特点:用于一些特定的符号来表示一些代码操作。这样就简化代码书写
所以,学习正则表达式就是学习一些特殊符号的操作和使用
好处:可以简化对字符串的操作
弊端:符号定义越多,正则越长,阅读性越差。
具体操作功能
1,匹配:String matches方法。用规则匹配整个字符串,只要有一处不符合规则,就结束匹配,返回false!
String qq="123456";
String regex="[1-9][0-9]{4,14}";
boolean b = qq.matches(regex);//将正则和字符串关联对字符串进行匹配。
2,切割:String split()方法
public static void splitDemo(){
/*String str="zhangsan lisi wangwu";
String reg=" +";//按照多个空格来进行切割
*/
/*String str="zhangsan.lisi.wangwu";
String reg="\\.";//按照.来进行切割
*/
/*String str="c:\\abc\\a.txt";
String reg= "\\\\";//按照\\来切割
*/
String str="asdkkfhqqijqriqjjok";
String reg="(.)\\1+";//按照叠词完成切割
/*
* 按照叠词切割,为了可以让规则的结果被重用,可以将规则封装成一个组
* 用()完成。组的出现都有编号,从1开始,想要使用已有的组可以通过\n
* (n就是组的编号)的形式来获取
*/
String[] arr =str.split(reg);
System.out.println(arr.length);
for(String s:arr){
System.out.println(s);
}
3,替换:String replaceAll()
public class RegexDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str ="wne1380000008hyfq123494988jd";
replaceAllDemo(str,"\\d{5,}","#");//将字符串中连续5位以上的数字替换成#
String str1="qwekkkuyfafffojnkoooobj";
replaceAllDemo(str1,"(.)\\1+","&");//将叠词替换成&
replaceAllDemo(str1,"(.)\\1+","$1");//将重叠的字母替换成单个字母,如:kkkk--->k
}
public static void replaceAllDemo(String str,String reg,String newStr){
str=str.replaceAll(reg, newStr);
System.out.println(str);
}
}
4,获取
1),将正则表达式编译成正则对象。使用的是Pattern中静态方法 compile(regex);
2),通过Pattern对象获取Matcher对象。
Pattern用于描述正则表达式,可以对正则表达式进行解析。
而将规则操作字符串,需要从新封装到匹配器对象Matcher中。
然后使用Matcher对象的方法来操作字符串。
如何获取匹配器对象呢?
通过Pattern对象中的matcher方法。该方法可以正则规则和字符串想关联。并返回匹配器对象。
3),使用Matcher对象中的方法即可对字符串进行各种正则操作。
package regular.expression;
import java.util.regex.*;
public class RegexDemo2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
getDemo();
}
public static void getDemo(){
String str="ming tian fang jia,da jia hao hao wan";
String reg="\\b[a-z]{3}\\b";
//将规则封装成对象
Pattern p= Pattern.compile(reg);
//让正则对象和要作用的字符串相关联,获取匹配器对象
Matcher m= p.matcher(str);
//System.out.println(m.matches());//其实String类中的matches方法用的就是Pattern
//和Matcher对象来完成的,只不过被String的方法封装后,用起来较简单,但功能单一
//boolean b=m.find();//将规则作用到字符串上,并进行符合规则的子串查找
//System.out.println(b);
//System.out.println(m.group());//用于获取匹配后结果
while(m.find()){
System.out.println(m.group());
System.out.println(m.start()+"-----"+m.end());//打印单词开始和结束的脚标
}
}
}
正则表达式的构造摘要
构造 | 匹配 |
|
|
字符 | |
x | 字符 x |
\\ | 反斜线字符 |
\0n | 带有八进制值 0 的字符 n (0 <= n <= 7) |
\0nn | 带有八进制值 0 的字符 nn (0 <= n <= 7) |
\0mnn | 带有八进制值 0 的字符 mnn(0 <= m <= 3、0 <= n <= 7) |
\xhh | 带有十六进制值 0x 的字符 hh |
\uhhhh | 带有十六进制值 0x 的字符 hhhh |
\t | 制表符 ('\u0009') |
\n | 新行(换行)符 ('\u000A') |
\r | 回车符 ('\u000D') |
\f | 换页符 ('\u000C') |
\a | 报警 (bell) 符 ('\u0007') |
\e | 转义符 ('\u001B') |
\cx | 对应于 x 的控制符 |
|
|
字符类 | |
[abc] | a、b 或 c(简单类) |
[^abc] | 任何字符,除了 a、b 或 c(否定) |
[a-zA-Z] | a 到 z 或 A 到 Z,两头的字母包括在内(范围) |
[a-d[m-p]] | a 到 d 或 m 到 p:[a-dm-p](并集) |
[a-z&&[def]] | d、e 或 f(交集) |
[a-z&&[^bc]] | a 到 z,除了 b 和 c:[ad-z](减去) |
[a-z&&[^m-p]] | a 到 z,而非 m 到 p:[a-lq-z](减去) |
|
|
预定义字符类 | |
. | 任何字符(与行结束符可能匹配也可能不匹配) |
\d | 数字:[0-9] |
\D | 非数字: [^0-9] |
\s | 空白字符:[ \t\n\x0B\f\r] |
\S | 非空白字符:[^\s] |
\w | 单词字符:[a-zA-Z_0-9] |
\W | 非单词字符:[^\w] |
|
|
POSIX 字符类(仅 US-ASCII) | |
\p{Lower} | 小写字母字符:[a-z] |
\p{Upper} | 大写字母字符:[A-Z] |
\p{ASCII} | 所有 ASCII:[\x00-\x7F] |
\p{Alpha} | 字母字符:[\p{Lower}\p{Upper}] |
\p{Digit} | 十进制数字:[0-9] |
\p{Alnum} | 字母数字字符:[\p{Alpha}\p{Digit}] |
\p{Punct} | 标点符号:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ |
\p{Graph} | 可见字符:[\p{Alnum}\p{Punct}] |
\p{Print} | 可打印字符:[\p{Graph}\x20] |
\p{Blank} | 空格或制表符:[ \t] |
\p{Cntrl} | 控制字符:[\x00-\x1F\x7F] |
\p{XDigit} | 十六进制数字:[0-9a-fA-F] |
\p{Space} | 空白字符:[ \t\n\x0B\f\r] |
|
|
java.lang.Character 类(简单的 java 字符类型) | |
\p{javaLowerCase} | 等效于 java.lang.Character.isLowerCase() |
\p{javaUpperCase} | 等效于 java.lang.Character.isUpperCase() |
\p{javaWhitespace} | 等效于 java.lang.Character.isWhitespace() |
\p{javaMirrored} | 等效于 java.lang.Character.isMirrored() |
|
|
Unicode 块和类别的类 | |
\p{InGreek} | Greek 块(简单块)中的字符 |
\p{Lu} | 大写字母(简单类别) |
\p{Sc} | 货币符号 |
\P{InGreek} | 所有字符,Greek 块中的除外(否定) |
[\p{L}&&[^\p{Lu}]] | 所有字母,大写字母除外(减去) |
|
|
边界匹配器 | |
^ | 行的开头 |
$ | 行的结尾 |
\b | 单词边界 |
\B | 非单词边界 |
\A | 输入的开头 |
\G | 上一个匹配的结尾 |
\Z | 输入的结尾,仅用于最后的结束符(如果有的话) |
\z | 输入的结尾 |
|
|
Greedy 数量词 | |
X? | X,一次或一次也没有 |
X* | X,零次或多次 |
X+ | X,一次或多次 |
X{n} | X,恰好 n 次 |
X{n,} | X,至少 n 次 |
X{n,m} | X,至少 n 次,但是不超过 m 次 |
|
|
Reluctant 数量词 | |
X?? | X,一次或一次也没有 |
X*? | X,零次或多次 |
X+? | X,一次或多次 |
X{n}? | X,恰好 n 次 |
X{n,}? | X,至少 n 次 |
X{n,m}? | X,至少 n 次,但是不超过 m 次 |
|
|
Possessive 数量词 | |
X?+ | X,一次或一次也没有 |
X*+ | X,零次或多次 |
X++ | X,一次或多次 |
X{n}+ | X,恰好 n 次 |
X{n,}+ | X,至少 n 次 |
X{n,m}+ | X,至少 n 次,但是不超过 m 次 |
|
|
Logical 运算符 | |
XY | X 后跟 Y |
X|Y | X 或 Y |
(X) | X,作为捕获组 |
|
|
Back 引用 | |
\n | 任何匹配的 nth 捕获组 |
|
|
引用 | |
\ | Nothing,但是引用以下字符 |
\Q | Nothing,但是引用所有字符,直到 \E |
\E | Nothing,但是结束从 \Q 开始的引用 |
常用正则表达式:
匹配中文字符的正则表达式: [u4e00-u9fa5]
——》匹配中文还真是个头疼的事,有了这个表达式就好办了
匹配双字节字符(包括汉字在内):[^x00-xff]
——》可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
匹配空白行的正则表达式:ns*r
——》可以用来删除空白行
匹配HTML标记的正则表达式:<(S*?)[^>]*>.*?</1>|<.*? />
——》网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
匹配首尾空白字符的正则表达式:^s*|s*$
——》可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
——》表单验证时很实用
匹配网址URL的正则表达式:[a-zA-z]+://[^s]*
——》网上流传的版本功能很有限,上面这个基本可以满足需求
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
——》表单验证时很实用
匹配国内电话号码:d{3}-d{8}|d{4}-d{7}
——》匹配形式如 0511-4405222 或 021-87888822
匹配中国邮政编码:[1-9]d{5}(?!d)
——》中国邮政编码为6位数字
匹配身份证:d{15}|d{18}
——》中国的身份证为15位或18位
匹配ip地址:d+.d+.d+.d+
——》提取ip地址时有用
匹配特定数字:
^[1-9]d*$ //匹配正整数
^-[1-9]d*$ //匹配负整数
^-?[1-9]d*$ //匹配整数
^[1-9]d*|0$ //匹配非负整数(正整数 + 0)
^-[1-9]d*|0$ //匹配非正整数(负整数 + 0)
^[1-9]d*.d*|0.d*[1-9]d*$ //匹配正浮点数
^-([1-9]d*.d*|0.d*[1-9]d*)$ //匹配负浮点数
^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$ //匹配浮点数
^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$ //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$ //匹配非正浮点数(负浮点数 + 0)
——》处理大量数据时有用,具体应用时注意修正
匹配特定字符串:
^[A-Za-z]+$ //匹配由26个英文字母组成的字符串
^[A-Z]+$ //匹配由26个英文字母的大写组成的字符串
^[a-z]+$ //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$ //匹配由数字和26个英文字母组成的字符串
^w+$ //匹配由数字、26个英文字母或者下划线组成的字符串