我知道我能夠像[^bar]
同樣否認一組字符,可是我須要一個正則表達式,其中否認適用於特定單詞-所以在個人示例中,如何否認實際的bar
而不是「 bar中的任何字符」? 正則表達式
您可使用否認的前瞻性或後瞻性 : 性能
^(?!.*?bar).* ^(.(?<!bar))*?$
或僅使用基礎知識: spa
^(?:[^b]+|b(?:$|[^a]|a(?:$|[^r])))*$
這些都匹配不包含bar
任何東西。 code
除非性能是最重要的問題,不然一般只須要經過第二遍就能夠輕鬆完成結果,而跳過那些與您要否認的單詞相匹配的結果一般會更容易。 字符串
正則表達式一般意味着您不管如何都在執行腳本或某種低性能的任務,所以請找到易於閱讀,易於理解和易於維護的解決方案。 get
下面的正則表達式將知足您的要求(只要支持否認的lookbehinds和lookaheads),便可正確匹配事物; 惟一的問題是,它與單個字符匹配(即,每一個匹配都是單個字符,而不是兩個連續的「小節」之間的全部字符),若是您使用的字符串很長,則可能會產生高開銷。 it
b(?!ar)|(?<!b)a|a(?!r)|(?<!ba)r|[^bar]
一個很好的方法是使用負前瞻 : io
^(?!.*bar).*$
否認的超前構造是一對圓括號,其中圓括號開頭是問號和感嘆號。 在先行內[是任何正則表達式模式]。 基礎
只是想到能夠作的其餘事情。 它與個人第一個答案有很大不一樣,由於它不使用正則表達式,因此我決定發表第二個答案。 bug
在字符串上使用您所選擇的語言的split()
方法等效,並帶有單詞否認做爲拆份內容的參數。 使用Python的示例:
>>> text = 'barbarasdbarbar 1234egb ar bar32 sdfbaraadf' >>> text.split('bar') ['', '', 'asd', '', ' 1234egb ar ', '32 sdf', 'aadf']
至少在Python中這樣作的好處是(至少我不記得該功能在Visual Basic或Java中是否相同),它能夠在重複輸入「 bar」時間接告訴您該字符串是因爲結果列表中包含「 bar」之間的空字符串(儘管開頭的空字符串是因爲字符串的開頭存在「 bar」的事實)。 若是您不但願這樣作,則只需從列表中刪除空字符串便可。