我有一個字符串爲什麼正則表達式引擎選擇從`.X | ..X | X.`匹配模式`..X`?
1234X5678
,我用這個正則表達式匹配模式
.X|..X|X.
我
34X
問題是,爲什麼我沒有拿到4X
或X5
?
爲什麼正則表達式選擇執行第二個模式?這裏
我有一個字符串爲什麼正則表達式引擎選擇從`.X | ..X | X.`匹配模式`..X`?
1234X5678
,我用這個正則表達式匹配模式
.X|..X|X.
我
34X
問題是,爲什麼我沒有拿到4X
或X5
?
爲什麼正則表達式選擇執行第二個模式?這裏
的主要觀點是:
正則表達式引擎默認情況下,分析從左至右輸入。
所以,你有一個交替模式.X|..X|X.
,你運行它1234X5678
。 See what happens:
每個選擇分支對字符串中的每個位置進行測試從左至右。
第1-7步顯示引擎如何嘗試匹配字符串開頭的字符。然而,沒有一個分支(.X
或..X
或X.
都不匹配12
或123
)。
步驟8-13只是重複相同的失敗情況,因爲沒有任何分支匹配23
或234
。
步驟14-19顯示成功方案,因爲34X
可以與分支2(..X
)匹配。因爲這個位置被匹配和消耗
正則表達式引擎不4
之前到達的位置。
而另外一個結論:
的交替的順序很重要,並且在NFA正則表達式引擎第一選擇匹配的勝利,但這種替代不必是第一個最短的一個,更遠更長的替代那匹配相同的字符在開頭可以比較早。
你用什麼工具可視化字符串匹配過程? – gfullam
我忘了添加它:[regex101.com,*正則表達式調試器*部分](https://regex101.com/r/lS2vI8/1)。現在添加。 –
您的預期產量是多少? 1234,5678? – Saleem
因爲這不是正則引擎(傳統NFA)的工作方式。 – Kasramvd
快速猜測 - 正則表達式正在嘗試一個貪婪的匹配? – Linuxios