java 正则表达式 贪婪匹配_Java 正则表达式 量词 --- 三种匹配模式【贪婪型、勉强型、占有型】...

在Sun的API中对在对

“最大匹配Greedy”“最小匹配Reluctant”“完全匹配Possessive”

的描述,不能让我明白他们有什么区别,现在将我对这三种匹配模式的理解写出来,供大家参考。

1、Greediness(

贪婪型

):

最大匹配

X?、X*、X+、X{n,}都是

最大匹配

。例如你要用“<.>”去匹配“a

aavaabb”,也许你所期待的结果是想匹配“”,但是实际结果却会匹配到“aava”。这是为什么呢?下面我们跟踪下最大匹配的匹配过程。

①“aavaab”,在进行最大匹配时,它把两个“>”都匹配了,它匹配了所有字符,直到文本的最后字符“b”③这时,发现不能成功匹配“>”,开始按原路回退,用“a”与“>”匹配,直到“ab”前面的“>”匹配成功。

2、Reluctant(Laziness)(

勉强型

):

最小匹配

X?、X*、X+、X{n,}都是最大匹配。好,加个?就成了Laziness匹配。例如X??、X*?、X+?、X{n,}?都是

最小匹配

,其实X{n,m}?和X{n }?有些多余。

最小匹配意味者,.+? 匹配一个字符后,马上试一试>的匹配可能,失败了,则.+?再匹配一个字符,再马上试一试>的匹配可能。JDK文档中Greedy 和Reluctant,它是以eat一口来隐喻的,所以翻译成贪吃和(勉强的)厌食最贴切了。不过我喜欢最大匹配、最小匹配的说法。

3、Possessive(

占有型

):

完全匹配

与最大匹配不同,还有一种匹配形式:X?+、X*+、X++、X{n,}+等,成为完全匹配。它和最大匹配一样,一直匹配所有的字符,直到文本的最后,但它不由原路返回。也就是说,一口匹配,搞不定就算了,到也干脆,偶喜欢。

先看两端代码:

Java代码

5e861280659a96c1abdf19c7f634af23.png

String s ="/m/t/wd/nl/n/p/m/wd/nl/n/p/m/wd/nl/n/p/m/v/n";

Pattern p = Pattern.compile("/m/t.*/nl/n/p/m");

Matcher m = p.matcher(s);

while(m.find()) {

System.out.println(m.group());

System.out.println(m.start());

System.out.println(m.end());

}

运行结果:

/m/t/wd/nl/n/p/m/wd/nl/n/p/m/wd/nl/n/p/m

0

40

Java代码

5e861280659a96c1abdf19c7f634af23.png

String s ="/m/t/wd/nl/n/p/m/wd/nl/n/p/m/wd/nl/n/p/m/v/n";

Pattern p = Pattern.compile("/m/t.*?/nl/n/p/m");

Matcher m = p.matcher(s);

while(m.find()) {

System.out.println(m.group());

System.out.println(m.start());

System.out.println(m.end());

}

运行结果:

/m/t/wd/nl/n/p/m/wd/nl/n/p/m/wd/nl/n/p/m

0

40

只是在.*后加了一个“?”, 结果就大不一样了。 可以这样说,如果想贪婪匹配,用.*, 如果想勉强匹配,就用.*?。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值