2013-02-11 70 views
0

我想找出其中一個特定的標記不會發生字符串,如:正則表達式塊否定

<xyz>[\w]+<[^(unwanted)]></xyz> 

其中unwanted將被解釋爲adentu。但我想要的是塊字符串。我如何用正則表達式表達它? 我已經試過負先行,這不工作:

<xyz>.+(?!unwanted).+</xyz> 

回答

3
<xyz>(?:(?!unwanted).)+</xyz> 

匹配所有字符在<xyz>...</xyz>,但只只要表達unwanted不會在任何人的開始。

+0

cHao,非常感謝你回答這個難題。 但是,答案也非常困難。解決方案已經吹捧我。 只是想檢查我的理解, 儘管順序(?!不需要)。或(。!不想要的),它不會改變效果,對吧? 爲什麼使用(?:)+?這是否意味着除了「不需要的」之外的任何角色坐在單個角色的位置? – 2013-02-14 20:49:29

+0

'(?:...)'把內部的東西分組,但是沒有捕獲它。如果你不關心捕獲,你可以只說'(...)',但這太浪費了。無論哪種方式都是爲了讓'+'適用於整個事物,所以它會匹配任何不是表達式'unwanted'開頭的字符。至於整件事情,它的工作原理是這樣的:它試圖匹配的每個字符,它首先做一個負向預測('(?!...)')以確保表達式'unwanted'不匹配那裏。如果沒有,那麼它會抓住那個角色,然後再次嘗試下一個角色。 – cHao 2013-02-15 04:14:13

+0

如果沒有'(?:...)'(或者可選的'(...)'),那麼'+'只適用於'.',並且最終會匹配任何沒有' t *開始*與'不需要的'。不過,由此產生的匹配在第一個字符之後的任何地方仍然可能有「不需要的」。這就是爲什麼你想在每個位置測試(因此,爲什麼你把前視和'.'分組在一起)。 – cHao 2013-02-15 04:23:58