我想匹配以下文本(字符串中的任何位置),其中字符串可以是A和之間的任何值;.NET正則表達式負向lookbehind無法正常工作
Astring;
但是我不想匹配以下
aAstring;
AAstring;
(?<![A|a])A.*?;
爲aAstring工作正常表達;但不適用於AAstring;
看起來這個lookaround不適用於同一個角色?我必須在這裏錯過簡單的東西。
我想匹配以下文本(字符串中的任何位置),其中字符串可以是A和之間的任何值;.NET正則表達式負向lookbehind無法正常工作
Astring;
但是我不想匹配以下
aAstring;
AAstring;
(?<![A|a])A.*?;
爲aAstring工作正常表達;但不適用於AAstring;
看起來這個lookaround不適用於同一個角色?我必須在這裏錯過簡單的東西。
首先,這是一個回顧後,沒有一個超前。要了解什麼是怎麼回事,打破什麼正則表達式是說:
(?<![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]).*?;
相同,但上述內容可能會更容易理解。
這很接近,但是我的目標表達式可能被嵌入到另一個字符串中。 – Jake1164
@ Jake1164 - 那麼'\ b'版本應該是你所需要的。由於您使用.NET,因此不要忘記將模式設置爲[逐字字符串](http://msdn.microsoft.com/zh-cn/library/aa691090%28v=vs.71%29.aspx)通過使用'@「\ bA(?![aa])。*?」'而不是'「\ bA(?![aa])。*?」'。 –
如果string
部分可以是任何字符串,那麼它匹配正確。正則表達式中的A
與文本中的第一個A
匹配,.*?
與Astring
匹配。並且在第一個A
之前沒有A
或a
。
如果您對string
部件有一些規則,那麼您應該添加它們,它應該可以解決您的問題。
負面後視效果正常。爲了實現你嘗試我建議使用負先行,如在此模式:"A(?![Aa]).*?;"
它將匹配A
然後不匹配如果下一個字符是A
或a
。如果你想確保字符串以A
開始,而不是一個較大的字符串中的部分比賽,該\b
元字符添加到模式的開頭:@"\bA(?![Aa]).*?;"
這是一個向後看,而不是向前看。 –
'[A | a]'沒有做你的想法。 (你想要的表達式是'[Aa]') – ridgerunner