Regular 4 正規表示式的匹配原理原則

2021-09-05 21:00:46 字數 1640 閱讀 7105

原則一:優先選擇最左端(最靠開頭)的匹配結果

根據這條規則,起始位置最靠左端的匹配結果總是優先於其他可能的匹配結果。這裡沒有規定優先匹配結果的長度,而只是規定,在所有可能的匹配結果中,優先選擇開始位置靠左端的。

匹配過程:正則匹配先從需要查詢的字串的起始位置開始,嘗試匹配整個表示式能匹配的所有樣式文字,如果在當前位置測試了所有可能之後不能找到匹配結果,正則引擎就是啟動傳動裝置向右移動乙個位置,也就是從字串的第二個字元之前的位置開始重新嘗試。在找到匹配結果以前必須在所有位置重複此過程。只能在嘗試了所有位置(從第乙個字元直到最後乙個字元)都不能匹配結果的情況下,才會報告「匹配失敗」。

所以如果用ee來匹配abeen的話,從字串開始第一輪嘗試失敗(因為ee不能匹配ab),第二輪嘗試也失敗(因為ee也不能匹配be),直到第三軟嘗試能夠成功,引擎會停止下來報告匹配ee成功.

如果不了解這個規則,有時候就不能理解匹配的結果。如用abeen來匹配:「this is 123abeen321 test by abeen」. 結果會是123abeen321中的abeen被匹配,而不是最後的abeen。

原則二:標準的匹配量詞*、+、?、是匹配優先的

標準量詞是匹配的,在匹配成功之前,進行嘗試的次數是存在上限和下限的,匹配優先量詞之所以得名,是因為他們總是(或者至少是嘗試)匹配多於匹配成功下限的字元。也就是說,標準匹配量詞的結果可能並非所有可能結果中最長的,但它們總是嘗試匹配可能多的字元,直到匹配上限為止。

例如: [0-9]+為什麼能匹配abeen 19820527 中的所有數字。1匹配成功之後,實際上已經滿足了成功的下限,但此表示式是匹配優先的,所以它不會停止在此處,而會繼續下去。繼續匹配19820527,直到字串結束。

過度的匹配優先

^.*(?[0-9][0-9])能夠匹配一行字串的最後兩位數字,如果有的話將它們存於test 組中。來看一下匹配過程, .* 首先匹配整行,而[0-9][0-9]是必須匹配的,在嘗試匹配行末的時候會失敗,它樣它會通知.*自己沒法匹配了,為了大局著想,大哥你還是交出點來吧。於是.*很有大哥風範,以大局為重交出乙個字元,如果不夠還會繼續交出字元。當然前提是大哥得先留下自己那份,也就是匹配成功的下限。

我們來看 ^.*(?[0-9][0-9]) 匹配 this is a test abeen 1982abeen的過程。.*首先匹配整個字串以後,第乙個[0-9]的匹配要求.*釋放乙個字元n,但是[0-9]還不能匹配,所以.*必須繼續交還字元e,如此迴圈只到交還2為止。但不幸的是第乙個[0-9]匹配成功後,第二個[0-9]不能匹配成功,於是.*大哥再次以大局為重,又釋放乙個字元8,這樣整個表示式就匹配成功,結果是this is a test abeen 1982,test內容為82.

先來先服務

如果想用^.*(?[0-9]+)來匹配一行的最後整個數字,比如匹配this is a test abeen 1982,結果test只捕獲了2,這是為什麼呢? 

你的本意也許是想捕獲1982,但結果為什麼是2呢!首先.*會捕獲整個字串,然後[0-9]+必須要捕獲( 注意是必須)乙個數字,所以.*交還了乙個2出來,接下來整個表示式中沒有必須要匹配的元素了,所以.*不會再交還字元。結果test只能捕獲2了。

這就是「先來先服務」原則,匹配優先的結構只會在被迫的情況下交還字元。

Regular 4 正規表示式的匹配原理原則

原則一 優先選擇最左端 最靠開頭 的匹配結果 根據這條規則,起始位置最靠左端的匹配結果總是優先於其他可能的匹配結果。這裡沒有規定優先匹配結果的長度,而只是規定,在所有可能的匹配結果中,優先選擇開始位置靠左端的。匹配過程 正則匹配先從需要查詢的字串的起始位置開始,嘗試匹配整個表示式能匹配的所有樣式文字...

PHP preg match 進行正規表示式匹配

preg match 函式用於進行正規表示式匹配,成功返回 1 否則返回 0 preg match 匹配成功一次後就會停止匹配,如果要實現全部結果的匹配,則需使用preg match all 函式。preg match pattern subject matches 引數 描述pattern 正規表...

正規表示式 4

正規表示式的結構與算術表示式的結構類似。即,各種元字元和運算子可以將小的表示式組合起來,建立大的表示式。通過在一對分隔符之間放置表示式模式的各種元件,就可以構建正規表示式。對於 jscript,分隔符是正斜槓 字元。例如 expression 在上面的示例中,正規表示式模式 expression 儲...