亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

正則表達式和否定整個字符組

正則表達式和否定整個字符組

嚕嚕噠 2019-08-09 16:13:45
正則表達式和否定整個字符組我正在嘗試一些我認為應該對我來說相當明顯的東西,但事實并非如此。我正在嘗試匹配一個不包含特定字符序列的字符串。我已嘗試使用[^ab],[^(ab)]等等來匹配不包含'a'或'b'的字符串,或只包含'a'或僅'b'或'ba'但不匹配'ab'的字符串。我給出的例子不符合'ab'這是真的,但它們也不會單獨匹配'a'而我需要它們。有一些簡單的方法可以做到這一點嗎?
查看完整描述

3 回答

?
慕絲7291255

TA貢獻1859條經驗 獲得超6個贊

使用否定前瞻:

^(?!.*ab).*$

更新:在下面的評論中,我說這種方法比彼得的答案慢。從那時起我就進行了一些測試,結果發現它確實稍微快一些。然而,偏愛另一種技術的原因不是速度,而是簡單性。

另一種技術,在這里描述為一種馴化的貪婪令牌,適用于更復雜的問題,例如匹配分隔符文本,其中分隔符由多個字符組成(如HTML,如Luke 在下面評論的那樣)。對于問題中描述的問題,它太過分了。

對于任何感興趣的人,我測試了一大塊Lorem Ipsum文本,計算不包含單詞“quo”的行數。這些是我使用的正則表達式:

(?m)^(?!.*\bquo\b).+$(?m)^(?:(?!\bquo\b).)+$

無論是在整個文本中搜索匹配,還是將其分解為行并單獨匹配,錨定前瞻一直優于浮動前瞻。


查看完整回答
反對 回復 2019-08-09
?
繁星淼淼

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


查看完整回答
反對 回復 2019-08-09
?
德瑪西亞99

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',因為外觀是零寬度(在大多數正則表達式實現中)。

有關頁面的更多信息


查看完整回答
反對 回復 2019-08-09
  • 3 回答
  • 0 關注
  • 871 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號