2016-01-31 95 views
5

是否有可能讓RegEx回退到字符串的開頭並重新開始匹配?RegEx回退到字符串的開始

這就是爲什麼我問。鑑於下面的字符串,我希望按照該順序捕獲子字符串black,red,blue和​​,而不考慮主題字符串中的出現順序,並且僅在主題字符串中存在所有子字符串。

$str ='blue-ka93-red-kdke3-green-weifk-black'

所以,對於所有的下面的字符串,正則表達式應該捕獲blackredblue和​​(按順序)

'blue-ka93-red-kdke3-green-weifk-black' 
'green-ka93-red-kdke3-blue-weifk-black' 
'blue-ka93-black-kdke3-green-weifk-red' 
'green-ka93-black-kdke3-blue-weifk-red' 

我不知道是否有不匹配捕獲組的方式然後回退到字符串的開頭並找到下一個捕獲組。我希望像^.*(?=(black))^.*(?=(red))^.*(?=(blue))^.*(?=(green))這樣的東西可以工作,但當然^和lookahead不以這種方式表現。

是否有可能構建這樣的RegEx?

對於上下文,我將在PHP中使用RegEx。

+3

像這樣:(?= *(黑))?['^(?= *(紅色))(?= *(藍色))(= *(綠))'](https://regex101.com/r/qB0bR5/1)?這將要求所有這些關鍵字在字符串中。 –

+0

@WiktorStribiżew是的,就是這樣,把它作爲答案扔掉,我會接受它,謝謝! – DelightedD0D

+0

@WiktorStribiżew:請詳細說明您答案中的每一步。 –

回答

3

您可以使用

^(?=.*(black))(?=.*(red))(?=.*(blue))(?=.*(green)) 

注:這將需要所有這些關鍵字是的字符串中。

demo

沒有辦法重置正則表達式匹配指數時,那麼,你只能使用捕捉在停泊開始積極前瞻內在機制。如果前一個返回true(發現符合其模式的文本字符串),則前瞻將匹配字符串開始處的空白位置(歸因於^),並且上述RegEx中的每個前瞻將被一個接一個地執行。

由於您的匹配,使用.*(此子模式超出了預覽範圍),並且重複了字符串錨點的啓動,如果您不使用多行修飾符,會自動使RegEx失敗,因此您的RegEx工作方式不同。

1

爲什麼不只是使用capture groups來維護訂單。

^(?:(black)|(red)|(blue)|(green)|.)+$ 

這將匹配任何字符串,所有顏色都是可選的。

See demo at regex101php demo at eval.in

+1

我實際上需要確保所有模式都出現在我當前的useage中,但是對於真棒可選匹配解決方案 – DelightedD0D