正则表达式中的数量词概念

最近看《JAVA编程思想》看到字符串的部分,在讲正则的时候,提到了一个我之前不知道的概念–数量词,在我看来,它决定了正则的匹配范围。

正则中的数量词有Greedy (贪婪)、Reluctant(懒惰)和Possessive(强占)三种

这里写图片描述

贪婪型

贪婪型:它首先匹配整个字符串,如果不匹配,就从右端去掉一个字符,再进行匹配,直到找到匹配或把整个字符串去完为止。

Pattern compile = Pattern.compile("(abc)?");
Matcher matcher = compile.matcher("abcabcabcabc");

System.out.println("是否匹配:" + matcher.find());
System.out.println("匹配结果:" + matcher.group());

结果:

是否匹配:true
匹配结果:abc

这个程序用”(abc)?” 去匹配”abcabcabcabc”,因为”?”表示0个或1个,所以匹配结果是“abc”,属于贪婪型。

懒惰(勉强)型

懒惰(勉强)型:与贪婪型逻辑相反,先从最小匹配开始,先从空白开始匹配,若不匹配就加入一个字符,直到找到匹配。 这个类型使用的方法是在最后加上一个“?”字符

Pattern compile = Pattern.compile("(abc)??");
Matcher matcher = compile.matcher("abcabcabcabc");

System.out.println("是否匹配:" + matcher.find());
System.out.println("匹配结果:" + matcher.group());

结果:

是否匹配:true
匹配结果:

这次我们的匹配规则在结尾多加了一个“?”,相当于使用了懒惰(勉强)型,懒惰型发现空白也能做到匹配(因为第一个?代表匹配的结果可以是0个) 所以匹配结果是“”。

强占(占有)型

强占(占有)型:它首先匹配整个字符串,但是跟贪婪型不一样的是,如果没有匹配到,就会放弃匹配。这个类型使用的方法是在最后加上一个“+”字符

Pattern compile = Pattern.compile("(abc)?+");
Matcher matcher = compile.matcher("abcabcabcabc");

System.out.println("是否匹配:" + matcher.find());
System.out.println("匹配结果:" + matcher.group());

结果:

是否匹配:true
匹配结果:abc

这次我们的匹配规则在结尾多加了一个“+”,相当于使用了强占(占有)型,强占型直接拿整个字符串进行匹配,发现可以匹配上, 所以匹配结果是“abc”。

注意事项

在java的regex语法中,我们使用的是matcher.find(),代表部分匹配,正如上面的例子,我们取的都是部分匹配的结果,如果你用如下语法

Pattern compile = Pattern.compile("(abc)?+");
Matcher matcher = compile.matcher("abcabcabcabc");

System.out.println("是否匹配:" + matcher.matches());
System.out.println("匹配结果:" + matcher.group());

结果便是报错,因为matcher.matches()代表完全匹配,整个字符串必须完全符合匹配规则,数量词在这里不起效果,这里要注意:

是否匹配:false
Exception in thread "main" java.lang.IllegalStateException: No match found
    at java.util.regex.Matcher.group(Matcher.java:536)
    at java.util.regex.Matcher.group(Matcher.java:496)
    at JDK.String.regex.Regex_3.main(Regex_3.java:18)

相关的例子可以在我的github上看到:
https://github.com/lovejj1994/DataStructures

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值