3 回答

TA貢獻1859條經驗 獲得超6個贊
使用否定前瞻:
^(?!.*ab).*$
更新:在下面的評論中,我說這種方法比彼得的答案慢。從那時起我就進行了一些測試,結果發現它確實稍微快一些。然而,偏愛另一種技術的原因不是速度,而是簡單性。
另一種技術,在這里描述為一種馴化的貪婪令牌,適用于更復雜的問題,例如匹配分隔符文本,其中分隔符由多個字符組成(如HTML,如Luke 在下面評論的那樣)。對于問題中描述的問題,它太過分了。
對于任何感興趣的人,我測試了一大塊Lorem Ipsum文本,計算不包含單詞“quo”的行數。這些是我使用的正則表達式:
(?m)^(?!.*\bquo\b).+$(?m)^(?:(?!\bquo\b).)+$
無論是在整個文本中搜索匹配,還是將其分解為行并單獨匹配,錨定前瞻一直優于浮動前瞻。

TA貢獻1775條經驗 獲得超11個贊
使用類似的字符類[^ab]將匹配不在字符集內的單個字符。(^作為否定的部分)。
要匹配不包含多字符序列的字符串ab,您需要使用否定前瞻:
^(?:(?!ab).)+$
并且正則表達式注釋模式中的上述表達是:
(?x) # enable regex comment mode
^ # match start of line/string
(?: # begin non-capturing group
(?! # begin negative lookahead
ab # literal text sequence ab
) # end negative lookahead
. # any single character
) # end non-capturing group
+ # repeat previous match one or more times
$ # match end of line/string

TA貢獻1770條經驗 獲得超3個贊
是的,它被稱為負向前瞻。它是這樣的 - (?!regex here)
。所以abc(?!def)
將匹配abc 而不是def。所以它會匹配abce,abc,abck等。
同樣有積極的前瞻 - (?=regex here)
。所以abc(?=def)
匹配abc后跟def。
也有負面和正面的背后 - (?<!regex here)
和(?<=regex here)
分別
需要注意的一點是,負前瞻是零寬度。也就是說,它不算是占用了任何空間。
所以它可能看起來像a(?=b)c
匹配“abc”但它不會。它將匹配'a',然后是'b'的正向前瞻,但它不會向前移動到字符串中。然后它會嘗試將'c'與'b'匹配,這將無效。類似地,^a(?=b)b$
匹配'ab'而不是'abb',因為外觀是零寬度(在大多數正則表達式實現中)。
有關此頁面的更多信息
- 3 回答
- 0 關注
- 871 瀏覽
添加回答
舉報