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

一、Greediness(贪婪型):最大匹配
X?、X*、X+、X{n,}都是最大匹配。例如你要用“<.+>”去匹配“a<tr>aava</tr>abb”,也许你所期待的结果是想匹配“<tr>”,可是实际结果却会匹配到“<tr>aava</tr>”。这是为何呢?下面咱们跟踪下最大匹配的匹配过程。
①“<”匹配字符串的“<”。②“.+”匹配字符串的“tr>aava</tr>ab”,在进行最大匹配时,它把两个“>”都匹配了,它匹配了全部字符,直到文本的最后字符“b”③这时,发现不能成功匹配“>”,开始按原路回退,用“a”与“>”匹配,直到“ab”前面的“>”匹配成功。
二、Reluctant(Laziness)(勉强型):最小匹配
     X?、X*、X+、X{n,}都是最大匹配。好,加个?就成了Laziness匹配。例如X??、X*?、X+?、X{n,}?都是最小匹配,其实X{n,m}?和X{n }?有些多余。
最小匹配意味者,.+? 匹配一个字符后,立刻试一试>的匹配可能,失败了,则.+?再匹配一个字符,再立刻试一试>的匹配可能。JDK文档中Greedy 和Reluctant,它是以eat一口来隐喻的,因此翻译成贪吃和(勉强的)厌食最贴切了。不过我喜欢最大匹配、最小匹配的说法。
三、Possessive(占有型):彻底匹配
spa

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

相关文章
相关标签/搜索