一、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,}+等,成爲徹底匹配。它和最大匹配同樣,一直匹配全部的字符,直到文本的最後,但它不禁原路返回。也就是說,一口匹配,搞不定就算了,到也乾脆,偶喜歡。翻譯