關於 匹配優先 和 忽略優先

2021-08-30 14:51:11 字數 1491 閱讀 6583

[color=green][size=large]為了更好的理解「匹配優先」和「忽略優先」我們可以這樣定義:

「匹配優先」可以理解為「貪婪匹配」或「非懶惰匹配」;

「忽略優先」可以理解為「非貪婪匹配」或「懶惰匹配」;[/size][/color]

[color=red][size=large]強調一點:表示式cat不是匹配以cat開頭的字串。而是匹配乙個c,再匹配乙個a,最後匹配乙個t。jeffrey e.f.friedl這樣告訴我們。[/size][/color]

[color=green][size=large]一、匹配優先[/size][/color]

[color=olive]字 串:[/color]

billionsandzillionsof

[color=olive]表示式:[/color]

.*

[color=olive]結 果:[/color]

billionsandzillions

[color=olive]描 述:[/color]

[color=black][size=large]匹配優先時.*只從自身出發,匹配盡可能多的內容,只有在全域性匹配需要的情況下才會「被迫」交還一些字元。

在最開始的匹配之後,.*能夠匹配任何字元,所以它會一直匹配到字串的末尾。

為了讓最後的能夠匹配,.*會不斷交還字元(或者,更確切的說,是正則引擎強迫它回退),順序:『>』、『b』、『/』、『<』直到滿足『<』匹配為止。[/size][/color]

[color=green][size=large]二、忽略優先[/size][/color]

[color=olive]字 串:[/color]

billionsandzillionsof

[color=olive]表示式:[/color]

.*?

[color=olive]結 果:[/color]

billions

zillions

[color=olive]描 述:[/color]

[size=large]開始的匹配之後,.*?首先決定不需要匹配任何字元,因為它是忽略優先的。

於是,控制權交給後面的『<』符號:

此時『<』無法匹配『b』,所以控制權交還給.*?則成功匹配『b』。

此時.*?又必須選擇,是繼續嘗試匹配,還是忽略?因為它是忽略優先的,會首先選擇忽略。

接下來『<』仍然無法匹配『i』,所以控制權又再一次的交由.*?成功匹配後再交由『<』,……這樣繼續直到『<』匹配成功。

此時位置為後第一次出現的位置。

這樣就出現了兩個成功匹配結果billionszillions[/size]

精通正規表示式之匹配優先與忽略優先

匹配優先 盡可能多的匹配 忽略優先 盡可能少的匹配 忽略優先只需要在原本的匹配優先量詞後加乙個問號即可,即在 一類字尾元字元後加入?即可 要注意的是,dfa不支援忽略優先。最近在工作當中在使用乙個正規表示式的時候遇到了乙個問題,用如下正規表示式匹配乙個字串的時候,沒有匹配出我想要的效果。匹配優先正規...

精通正規表示式六 匹配優先與忽略優先

匹配優先 盡可能多的匹配 忽略優先 盡可能少的匹配 我們剛開始接觸的都是匹配優先 忽略優先只需要在原本的匹配優先量詞後加乙個問號即可 要注意的是,dfa不支援忽略優先。來看下面兩個例子 匹配優先 忽略優先 原因是什麼呢?上面說過,匹配優先總是盡可能多的匹配,所以 w 先匹配所有的文字,然後為了匹配 ...

關於深度優先和廣度優先的問題

depth first search和breadth first search,即深度優先和廣度優先是圖的兩種搜尋的方法。其實與其說是方法,不如說是兩種思想。下面我們就來介紹這兩種思想。1 depth first search 深度優先是指在圖的查詢中,對每乙個分支深入到不能再深入為止,如果到達了終...