正規表示式筆記 3 貪婪 勉強 獨佔三種匹配量詞

2021-06-23 05:17:00 字數 2177 閱讀 9664

regex :

在筆記 1 中講到過?(重複0次或1次)、*(重複0次或多次)、+(重複1次或多次)。

greedy quantifiers 

貪婪reluctant quantifiers 

勉強possessive quantifiers 

獨佔x?

x??x?+

x*x*?

x*+x+

x+?x++xx?

x+xx?x+xx?

x+

greedy :

匹配最長。在貪婪量詞模式下,正規表示式會盡可能長地去匹配符合規則的字串,且會回溯

**:

ggicci's facebook

";

2: pattern pattern = pattern.compile(".*");
3: matcher matcher = pattern.matcher(source);
4:

while (matcher.find())

//輸出:

2:

<

li>ggicci's blog

li><

li>ggicci's facebook

li>

解釋:首先 .* 匹配任何字元(在非 dotall 模式下不匹配 \n,\r,\a 一類字元),在 source 中第乙個被匹配的 後面直至最後乙個字元(也就是的 >)都符合 .* 的匹配規則,但是顯然如果 .* 匹配到最後乙個字元,那麼沒有剩餘的字元去匹配正規表示式中還未匹配的 的,那麼會引起匹配失敗。但是失敗後會回溯(這一點與獨佔量詞不同,下面會講到)。回溯後這段正規表示式將匹配到 source 中第乙個 和第二個 以及之間的內容,如上面的輸出所示。

reluctant :

匹配最短。在勉強量詞模式下,正規表示式會匹配盡可能短的字串。

**:

ggicci's facebook

";

2: pattern pattern = pattern.compile(".*?");
3: matcher matcher = pattern.matcher(source);
4:

while (matcher.find())

//輸出:

2:

<

li>ggicci's blog

li>

3:

<

li>ggicci's facebook

li>

解釋:source 中第乙個匹配到之後到第乙個之間的字元都符合 .* 的匹配規則,同時如果繼續匹配 也符合這個規則,但是勉強模式下,它會盡可能短地匹配字串,故第乙個找到的字串應該是 ggicci』s blog,如上面輸出所示。然後它會繼續匹配剩餘的字串,找到第二個。

possessive :

同貪婪一樣匹配最長。不過在獨佔量詞模式下,正規表示式盡可能長地去匹配字串,一旦匹配不成功就會結束匹配而不會回溯

**:

ggicci's facebook

";

2: pattern pattern = pattern.compile(".*+");
3: matcher matcher = pattern.matcher(source);
4:

while (matcher.find())

解釋:這段正規表示式將不會在 source 找到任何匹配的內容,因為 匹配到後, .*+ 所能匹配的字元盡可能長地匹配下去,直到 source 的最後乙個字元,這必將引起匹配失敗,但是在獨佔模式下一旦匹配失敗就不會回溯,故不存在像貪婪模式一樣回溯之後找到 之前的 的情況。

正規表示式以及貪婪 勉強 獨佔三種量詞

字元描述 將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個向後引用 或乙個八進位制轉義符。例如,n 匹配字元 n n 匹配乙個換行符。序列 匹配 而 則匹配 匹配輸入字串的開始位置。如果設定了regexp物件的multiline屬性,也匹配 n 或 r 之後的位置。匹配輸入字串的結束位置。如果...

正規表示式3 非貪婪模式

author version v1.0 description 非貪婪匹配 date 2020 1 10 public class regextest 正規表示式預設使用貪婪匹配,盡可能多的向後匹配 param s public static void matchforzero string s 非...

正規表示式貪婪模式

貪婪匹配與非貪婪匹配 貪婪匹配 預設情況下,正規表示式使用最長匹配原則 也叫貪婪匹配原則 例如 要將 zoom 中匹配 zo?的部 分替換成 r 替換的的結果是 rom 如果要將 zoom 中匹配 zo 的部分替換成 r 替換後的結果是 rm 非貪婪匹配 當字元?緊隨其他限定符 之後時,匹配模式變成...