2014-05-07 20 views
2

我想知道如果存在例如給定的這個輸入端的正則表達式:只用一個正則表達式就可以解決這個問題嗎?

lkjs kjsfjk ijsfjá13total wer6klje附加LNK jshv kjsdfjk DJ d 22total kejk jksfljkakvhjrĴ3total fkljbher JR6 hrew7 HWR 41total sfdkj附加iuwefjkwf7 7erfh SF 5總 KLJ KJ kjsef87 jhwfe7 89 JHF

可輸出這3場比賽,這是數字後面total,不包含(尋找下一個數字之前)之後的字additional

22 
3 
5 

所以,例如我不匹配13,因爲

13total wer6klje附加LNK jshv kjsdfjk DJ d 22total

包含單詞additional

我沒有匹配41因爲

41total sfdkj額外iuwefjkwf7 7erfh SF 5總

包含附加字

讓我解釋示例中使用的輸入結構:

randomText 13total randomText aditional randomText 
22total randomText 
3total randomText 
41total randomText aditional randomText 
5total randomText 

所以基本上輸入是一樣的東西:

randomText X_total randomText_that_contains_or_not_'additional' 
X_total randomText_that_contains_or_not_'additional' 
.... 
X_total randomText_that_contains_or_not_'additional' 

我知道如何使用一些額外的代碼來解決這個問題(使用多個模式和比賽,如果其他結構...),但我正在使用的系統,不能使用這些。它只是可以滿足一個正則表達式(這是一個複雜的系統,不容易修改)。

因此,例如,用正則表達式[0-9]+(?=total)我會得到這個匹配:13223415

,但正如我說,我只需要2235

燦任何人建立一個更復雜的正則表達式匹配這3個數字?

謝謝!

回答

2

當然是可能的(假設你的正則表達式的味道支持lookahead assertions

\d+(?=total(?!\D*additional)) 

See it here on regex101

\d+匹配一個或多個數字

(?=total(?!\D*additional))嵌套環視斷言。數字已經被其次是「總」後面沒有額外的(只有非數字插圖中)

基於Bergis評論更高級的例子:

​​

See it on regex101

我在這裏尋找更多的只要我找不到\d+total

+0

'\ D'是一個很好的技巧,可用於所提供的示例輸入,但我不確定實際文本是否保證不包含任何數字。你是否可以讓「附加」前面的文本只允許包含「\ d + total」? – Bergi

+1

@Bergi,我當然可以看到我的更新 – stema

2

您可以使用(在total總是會被一個數字的前面,對吧?)

\d+(?=total(?!(?:\D|\d(?!total))*additional)) 

說明

的想法是在未來<digit>total之前,禁止任何additional

\d+      # digits 
(?=total    # followed by total 
    (?!     # not followed by... 
     (?:    
      \D++  # not a digit (possessive quantifier) 
     |    # OR 
      \d(?!total) # a digit, but not followed by total 
     )*+    # any number of times 
    additional 
    ) 
) 

如果找到一個負先行將失敗的正則表達式,和我們」請確保不要超過<digit>total感謝(?:\D|\d(?!total))

參見demo here

相關問題