2016-03-14 44 views
1

讓我們假設我想匹配單詞「貓」,但這個詞之前,不應該在同一行正則表達式 - 禁用同一行的具體子

匹配的是單詞「鼠標」:

Hello, cat! 

匹配

Hello, mouse! 
Hello, cat! 

不匹配

Hello, mouse and cat 

但它應該正確處理任何行,例如,只是「貓」也應該匹配。 我有一個正則表達式不工作

(?!\bmouse\b)[^\n]*cat 

五月有人幫助嗎?由於

+1

你是什麼正則表達風味/語言使用? – anubhava

+0

我想你可以試試['^(?!。* \ bmouse \ b。* \ bcat \ b)。*'](https://regex101.com/r/hU6kV9/1)。但是,它將匹配整條線。你需要一個無限寬度的負向lookbehind才能匹配沒有在'mouse'前面的'cat'。這取決於你使用的正則表達式庫。請參閱['(?<!\ bmouse \ b。*)\ bcat \ b' demo](http://regexstorm.net/tester?p=(%3f%3c!%5cbmouse%5cb。*)%5cbcat% 5cb&i =您好%2c +小鼠!%0d%0a您好%2c +貓!%0d%0aNot +匹配%0d%0a%0d%0a您好%2c +鼠標+和+貓) –

+0

@anubhava,java.util.regex – Ivan

回答

1

發帖,因爲我在評論答案爲你工作。

可以使用受約束的寬度回顧後(一用一限制性量詞):

"(?<!\\bmouse\\b.{0,1000})\\bcat\\b" 

由於最小和最大限制是已知的,引擎知道可能回顧後發模式長度。

參見regex demo

模式擊穿:

  • (?<!\\bmouse\\b.{0,1000}) - 檢查是否存在具有0至1000的任何字符分隔的當前位置,但換行符
  • \\bcat\\b之前整個字mouse - 全字cat
0

試試這個正則表達式負前瞻:

^(?!.*?\bmouse\b.*\bcat\b).* 

(?!.*?\bmouse\b.*\bcat\b)爲負先行斷言失敗時mouse在同一行cat之前是存在的。 \b用於字邊界斷言。

RegEx Demo