正则表达式,是由特定符号构成的字符串,它的作用用一种简单的格式字符串去描述另一个字符串。
在java中,正则表达式有四种作用,分别为:
一、验证字符串是否匹配;
二、分割字符串;
三、替换字符串;
四、分组提取。
一、验证字符串是否匹配
验证字符串是否匹配是正则中最为常见的一种作用
1、正则表达式可以以^开头,以$结尾,用于限定字符串的匹配范围。用"^XXX$"的样子表示,将正则里的内容书写在^$当中,如"^[0-9]$"。
在验证字符串是否匹配时,一般都加上^$;在分组提取的时候,可考虑加或者不加
2、正则的匹配使用matches方法,匹配方式为string.matches(regex);
如String string="8",string.matches("^[0-9]$"),返回值为boolean。
3、正则的中的内容使用中括号[]括起来,长度用{}括起来。()用于组合匹配
[]中的内容如:[0-9]表示数字,[a-z]表示英文小写字母,[A-Z]表示英文大写字母,[0-9a-zA-Z]表示数字或者英文字母
[]也可作为字符集合:如”^[_-*]$”表示_或-或*,
{}中的内容如:{1,}表示长度至少为1,{3,6}表示长度为3到6,{5}表示长度为5。若不写{}或其它表示长度的符号,默认长度为1
[]{}一般组合使用,如"^[0-9]{3,5}$"表示3到5位的数字,"^[a-zA-Z]{6}$"表示6位字母,
()用于组合匹配,如"^([a-zA-Z]{1,}[0-9]{1,}){6,}$"表示含有字母与数字的至少6位的字符串
4、正则常用符号:
*等价于{0,}
?等价于{0,1},表示前面的内容可以有,也可以没有
+等价于{1,}
.表示匹配\n除外的任意字符
^表示非,如"^[^0-9]$"表示不是数字
.*组合使用表示任意长度的任意内容
|表示或,两项中的一个。如:String regex="^z|food$"表示“z”或“food”,
而String regex="^(z|f)ood)$"表示“zood”或“food”
\\转义字符,有特殊含义的字符,若要直接使用,都需要转义
如:【+】【.】【*】【?】【^】【|】【' '】【" "】【()】【{}】【[]】【$】【\】等在正则表达式中有其它特殊含义,要直接使用,需要通过转义符号转义\\
注意:【' '】【" "】【()】【{}】【[]】等符号若在正则中需要直接使用,在符号的两边都需要进行转义
例:匹配算式:两个小数相乘后等于或不等于另一个整数或小数,如"1.37*5.3!=9.4";"8.0*1.5=12"
String regex = "^[0-9]{1,}\\.[0-9]{1,}\\*[0-9]{1,}\\.[0-9]{1,}!?=[0-9]{1,}(\\.[0-9]{0,})?$";
其中,!?表示符号【!】可以有也可以没有,(\\.[0-9]{0,})?表示小数点及其之后的数字可以有也可以没有
5、其它符号:
\\d:等价于[0-9],表示0-9中的数字
\\D:等价于[^0-9],表示非数字
\\w:等价于[0-9a-zA-Z_],表示数字或字母或下划线
\\W:等价于[^0-9a-zA-Z_],表示非数字或字母或下划线
\\s:匹配空白字符" "
\\S:匹配非空白字符
[\u4e00-\u9fa5] 表示一个汉字
二、分割字符串:使用split方法
如:
String mail = "henrychen@hotmail.com.cn"; final String[] ps = mail.split("@|\\.");
通过符号@与符号.将字符串mail分割,存入数组ps中。
此时ps中的内容为:[henrychen,hotmail,com,cn]
三、替换字符串:使用replaceAll方法
replaceAll共有两个参数,其中第一个参数为正则表达式的式子,第二个参数为要替换掉的内容
String article = "564587456"; System.out.println(article.replaceAll("^[0-9]+$"," "));
四、根据小括号()分组提取
先举例:
String mail = "henrychen@hotmail.com.cn"; String regex = "^([0-9a-z]{3,18})@(([0-9a-z]{2,10})\\.(com.cn))$"; Pattern pat = Pattern.compile(regex); //生成匹配器 Matcher mat = pat.matcher(mail); //先验证字符串mail与正则regex是否匹配 if(mat.find()){ //再分组提取出字符串 for (int i = 1; i <= mat.groupCount(); i++) { System.out.println(mat.group(i)); } }else{ System.out.println("not matched"); }
上述代码中regex中的小括号有([0-9a-z]{3,18})、(([0-9a-z]{2,10})\\.(com.cn))、([0-9a-z]{2,10})、(com.cn)
则提取(输出)出来的结果为:henrychen
hotmail.com.cn
hotmail
com.cn
贪婪模式.*与非贪婪模式.*?
.*与.*?都表示任意长度的任意内容
贪婪模式:尽可能匹配更多的内容
如:
Pattern pattern1 = Pattern.compile("a.*b");
Matcher matcher1 = pattern1.matcher("abbbbbbbbbb");
if(matcher1.find()){ System.out.println(matcher1.group()); }//matcher1.find()的作用是分组提取
则输出:abbbbbbbbbb
非贪婪模式:尽可能匹配更少的内容
如:
Pattern pattern2 = Pattern.compile("a.*?b");//此时若在complie()中的正则旁加上^$,则无法完成非贪婪模式的匹配,因为^$会限定字符串的匹配范围,使其整体匹配
Matcher matcher2 = pattern2.matcher("abbbbbbbbbb");
if(matcher2.find()){ System.out.println(matcher2.group()); }
则输出:ab