2011-10-06 107 views
4

我想匹配以下文本(字符串中的任何位置),其中字符串可以是A和之間的任何值;.NET正則表達式負向lookbehind無法正常工作

Astring; 

但是我不想匹配以下

aAstring; 
AAstring; 

(?<![A|a])A.*?;爲aAstring工作正常表達;但不適用於AAstring;

看起來這個lookaround不適用於同一個角色?我必須在這裏錯過簡單的東西。

+0

這是一個向後看,而不是向前看。 –

+0

'[A | a]'沒有做你的想法。 (你想要的表達式是'[Aa]') – ridgerunner

回答

2

首先,這是一個回顧後,沒有一個超前。要了解什麼是怎麼回事,打破什麼正則表達式是說:

(?<![A|a])A #An A that is not preceded by A, a, or a literal | 
.?;   #Any number of characters followed by ; 

現在考慮您的輸入,AAstring

A  #An A that is not preceded by A (because it's at the beginning of the string) 
Astring #Some characters followed by ; 

所以回顧後工作,它只是沒有做什麼你認爲它的確如此。我想你想要的是這樣的:

^(?![Aa]{2})A.*?; 

錨定本身的字符串的開頭,所以你知道在哪裏先行是要去看看。這裏的意思是這樣:

^   #Beginning of the line 
(?![Aa]{2}) #"The following string must not start with two As in a row, regardless of case" 
A.*?;  #Capital A followed by anything followed by ; 

您也可以嘗試

\b(?![Aa]{2})A.*?; 

,如果你的目標不是在該行的開始。

請注意,這實際上與^A(?![Aa]).*?;\bA(?![Aa]).*?;相同,但上述內容可能會更容易理解。

+0

這很接近,但是我的目標表達式可能被嵌入到另一個字符串中。 – Jake1164

+0

@ Jake1164 - 那麼'\ b'版本應該是你所需要的。由於您使用.NET,因此不要忘記將模式設置爲[逐字字符串](http://msdn.microsoft.com/zh-cn/library/aa691090%28v=vs.71%29.aspx)通過使用'@「\ bA(?![aa])。*?」'而不是'「\ bA(?![aa])。*?」'。 –

2

如果string部分可以是任何字符串,那麼它匹配正確。正則表達式中的A與文本中的第一個A匹配,.*?Astring匹配。並且在第一個A之前沒有Aa

如果您對string部件有一些規則,那麼您應該添加它們,它應該可以解決您的問題。

+0

是的字符串可以是任何東西(謝謝我更新了這個問題)。我嘗試更新正則表達式(?<![A | a])A(。*?);並獲得相同的結果。 – Jake1164

+1

如果字符串可以是任何東西,那麼它也可以是'Astring'。這意味着你得到的結果是正確的。 – svick

+0

這對我的解決方案也是一個關鍵的幫助。我必須將「字符串」定義爲略多於任何字符串。 – Jake1164

1

負面後視效果正常。爲了實現你嘗試我建議使用負先行,如在此模式:"A(?![Aa]).*?;"

它將匹配A然後不匹配如果下一個字符是Aa。如果你想確保字符串以A開始,而不是一個較大的字符串中的部分比賽,該\b元字符添加到模式的開頭:@"\bA(?![Aa]).*?;"

相關問題