2009-03-04 45 views

回答

182

你可以使用一個前瞻斷言:

(?!999)\d{3} 

這個例子不是999其他三個數字相匹配。


但是,如果你碰巧不具有此功能的正則表達式實現(見Comparison of Regular Expression Flavors),你可能要建立與你自己的基本特徵正則表達式。

基本語法兼容的正則表達式只能是:

[0-8]\d\d|\d[0-8]\d|\d\d[0-8] 

但這也匹配任何三個數字序列,是不是999

+1

預讀不是標準的正則表達式語法,它是一個Perl擴展,它只能在Perl,PCRE(Perl兼容的RegEx)或其他非標準實現中工作 – Juliano 2009-03-04 19:26:54

+9

它可能不是標準的,但不要大多數現代語言都支持它?什麼語言*不支持這些日子的預測? – 2009-03-04 19:45:46

+0

的確如此。但大多數正則表達式支持此功能(請參閱)。 – Gumbo 2009-03-04 19:49:02

15

與模式匹配並使用宿主語言反轉匹配的布爾結果。這將更清晰可維護。

4

常規語言的補充也是一種常規語言,但要構建它,必須爲常規語言構建DFA,並將任何有效的狀態更改爲錯誤。一個例子見this。頁面沒有說的是它將/(ac|bd)/轉換爲/(a[^c]?|b[^d]?|[^ab])/。從DFA轉換回正則表達式不是微不足道的。如果您可以使用正則表達式並更改代碼中的語義,就像前面提出的那樣更容易。

1

格局 - 再

str.split(/re/g) 

將返回以外的所有模式。

測試here

0
(B)|(A) 

那麼使用了什麼組2個捕獲...

25

如果你想在一個字符串匹配一個單詞A和不匹配一個單詞B.例如: 如果你有一個文本:

1. I have a two pets - dog and a cat 
2. I have a pet - dog 

如果你要搜索的文本行是有一隻狗爲寵物和沒有貓您可以使用此正則表達式:

^(?=.*?\bdog\b)((?!cat).)*$ 

它會發現只有第二行:

2. I have a pet - dog 
7

notnot,復活這個古老的問題,因爲它有一個簡單的解決方案,WASN」提到。 (在爲regex bounty quest做一些研究時發現了你的問題。)

我面臨的情況是我必須匹配(A和〜B) 模式。

這個基本的正則表達式是簡單得嚇人:B|(A)

你只是忽視了整個比賽和檢查組1捕獲,其中將包含A.

一個例子(與所有有關的免責聲明解析HTML中的正則表達式):A是數字,B是內<a tag

正則表達式的數字:<a.*?<\/a>|(\d+)

Demo(看1組右下窗格)

參考

How to match pattern except in situations s1, s2, s3

How to match a pattern unless...

0

我的答案在這裏可能會解決你的問題,以及:

https://stackoverflow.com/a/27967674/543814

  • 而不是替換,您可以使用匹配。
  • 而不是組$1,你會讀取組$2
  • 集團$2被禁止在那裏,你會避免。

實施例:

Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");

第一捕獲組指定要避免的模式。最後一個捕獲組捕獲其他所有內容。簡單地讀出那個組,$2

相關問題