2016-03-11 37 views
3

我有一個字符串爲什麼正則表達式引擎選擇從`.X | ..X | X.`匹配模式`..X`?

1234X5678 

,我用這個正則表達式匹配模式

.X|..X|X. 

34X 

問題是,爲什麼我沒有拿到4XX5

爲什麼正則表達式選擇執行第二個模式?這裏

+0

您的預期產量是多少? 1234,5678? – Saleem

+0

因爲這不是正則引擎(傳統NFA)的工作方式。 – Kasramvd

+0

快速猜測 - 正則表達式正在嘗試一個貪婪的匹配? – Linuxios

回答

3

的主要觀點是:

正則表達式引擎默認情況下,分析從左至右輸入。

所以,你有一個交替模式.X|..X|X.,你運行它1234X5678See what happens

enter image description here

每個選擇分支對字符串中的每個位置進行測試從左至右

第1-7步顯示引擎如何嘗試匹配字符串開頭的字符。然而,沒有一個分支(.X..XX.都不匹配12123)。

步驟8-13只是重複相同的失敗情況,因爲沒有任何分支匹配23234

步驟14-19顯示成功方案,因爲34X可以與分支2(..X)匹配。因爲這個位置被匹配和消耗

正則表達式引擎不4之前到達的位置。

而另外一個結論:

的交替的順序很重要,並且在NFA正則表達式引擎第一選擇匹配的勝利,但這種替代不必是第一個最短的一個,更遠更長的替代那匹配相同的字符在開頭可以比較早。

+0

你用什麼工具可視化字符串匹配過程? – gfullam

+1

我忘了添加它:[regex101.com,*正則表達式調試器*部分](https://regex101.com/r/lS2vI8/1)。現在添加。 –

相關問題