2016-09-13 46 views
2

中最後一次出現後存在我有一個源字符串,它看起來像這樣:mID00231mID00008mID00231mID00054mID00013mID00008mID00065匹配,如果所有BCD..n的

我想創建,使用這個例子中的模式,方法是:在過去發生在一個或多個發生的 {mID00054,mID00013,mID00008,mID00065}每個必須遵循它(在任何順序)。

比賽的例子:不匹配,因爲缺少「mID00065」的

mID00231mID00008mID00231mID00054mID00013mID00008mID00065 
mID00231mID00013mID00054mID00008mID00065mID00008 

實施例:不匹配的

mID00231mID00054mID00013mID00008 

實施例,因爲「mID00231」最後一次出現之後不是一個「mID00054」和「mID00008」:

mID00231mID00013mID00065mID00054mID00008mID00231mID00013mID00065 

我對於正則表達式還是比較陌生的,但通常都會到達該方法有效。這一個非常困難。我試過這個:

(?:mID00231)(?:(?=.*mID00054)(?=.*mID00013)(?=.*mID00008)(?=.*mID00065).*) 

它適用於第一個元素(mID00231)只出現一次的情況。如果元素重複,則模式失敗。任何幫助表示讚賞。

+0

當你說「其次」時,你的意思是「緊隨其後」嗎? – redneb

+0

This regex'mID00231((?=(?:(?!mID00231)。)* mID00054)(?=(?:(?!mID00231)。)* mID00013)(?=(?:(?!mID00231)。)* mID00008)(?=(?:(?!mID00231)。)* mID00065)(?:(?!mID00231)。)*)'看起來很可怕。你確定你需要一個正則表達式嗎? –

+0

好的,你可以用簡單的lookahead替換脾氣暴躁的代幣。 –

回答

1

你需要的,如果有相同的值與負向前查找失敗的比賽:

mID00231((?!.*mID00231)(?=.*mID00054)(?=.*mID00013)(?=.*mID00008)(?=.*mID00065).*) 
     ^^^^^^^^^^^^^^ 

regex demo

詳細

  • mID00231 - 0+任何字符但之後的任何地方不能有mID00231 - 匹配一個mID00231文本
  • ( - 開始捕獲組
    • (?!.*mID00231)換行
    • (?=.*mID00054) - 必須是mID00054 0+任何字符,但換行符
    • (?=.*mID00013)後的任何地方 - 0+任何字符,但換行符後的任何地方必須有mID00013
    • (?=.*mID00008) - 必須有mID00008之後的任意位置0+任何字符,但換行符
    • (?=.*mID00065) - 必須有mID00065 0+後的任何地方的任何字符,但換行符
  • .* - 0+任何字符,但換行符
  • ) - 捕獲組的結束。
相關問題