2014-04-30 20 views
0

如果在正則表達式中使用多個{min,max}量詞,我會發現並非所有組合都被使用。正則表達式中的多個{min,max}量詞

/[XYZ]{15,20}[WXY]{15,20}/ 

我測試的11K字一個漂亮的隨機字符串,但結果不出我所料:link

我想,第一對[XYZ] {15} WXY] {15}被評估爲TRUE,然後跳轉到下一個[XYZ] {15} [WXY] {16}。因此,問題:

爲什麼perl採取第一種情況/[XYZ]{15}[WXY]{15}/,然後移動到/[XYZ]{16}[WXY]{15}/而不是/[XYZ]{15}[WXY]{16}/

我可以控制這種行爲嗎?或者我需要繼續前進並生成這些模式的所有組合並逐個搜索?

感謝您的任何建議。

PS。 這是我以前的帖子有點linked

+0

什麼字符串不工作,例如,你確實希望它能夠工作? – sshashank124

回答

6

我認爲你身邊存在誤解。首先,兩個量詞的最小值都不匹配正則表達式。

的正則表達式引擎試圖起初經常匹配的第一個字符地(Quantifiers默認情況下greedy),所以[XYZ]{15,20}匹配,如果有至少15。然後,它看起來是有其他字符,...最大值直到它找到20,所以當它發現在[XYZ],然後的15和20之間時,它繼續檢查模式的其餘部分。

實施例:

(X{15,20})(X{15,20}) 

和35 「X」

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 

你將得到第一組中的第一 「X」,和下面15「X字符串「在第二組中。

See it on Regexr

+0

然後,底線是生成所有組合。謝謝。 – mjp

0

下面是正則表達式如何進行匹配視覺例如:

正如你所看到的,正則表達式匹配執行左至右。在使用諸如(first|second|f1rst|s2cond)等許多複雜變化時,考慮到這一點尤爲重要。

因此,正則表達式引擎會在它移動到後面的字符類之前完全展開左邊的{15,20}

+0

有趣的演示。請問你用什麼來產生它? – mjp

+0

這是從我最喜歡的正則表達式站點:http://regex101.com。檢查調試功能。 –