`

java 正则表达式

    博客分类:
  • java
阅读更多

SunAPI中对在对 “最大匹配Greedy”“最小匹配Reluctant”“完全匹配Possessive”的描述,不能让我明白他们有什么区别,现在将我对这三种匹配模式的理解写出来,供大家参考。

 

1Greediness(贪心)匹配:

X?X*X+X{n}都是最大匹配。例如你要用“<.+>”去匹配“a<tr>aava </tr>abb”,也许你所期待的结果是想匹配“<tr>”,但是实际结果却会匹配到“<tr>aava </tr>”。这是为什么呢?下面我们跟踪下最大匹配的匹配过程。

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

 

2Reluctant(Laziness)最小匹配

     X?X*X+X{n}都是最大匹配。好,加个?就成了Laziness匹配。例如X??X*?X+?X{n}?都是最小匹配,其实X{nm}?X{n }?有些多余。

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

 

3、Possessive完全匹配

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

Use a possessive quantifier for situations where you want to seize all of something without ever backing off; it will outperform the equivalent greedy quantifier in cases where the match is not immediately found.

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics