java正则表达式详解

正则表达式,是由特定符号构成的字符串,它的作用用一种简单的格式字符串去描述另一个字符串。

在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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值