2016-09-27 92 views
-1

說我有以下字符串:正則表達式負回顧後比賽回顧後文.NET

PB-GD2185-11652-MTCH 
GD2185-11652-MTCH 
KD-GD2185-11652-MTCH 
KD-GD2185-11652 

我想,如果在字符串中有MTCH,不與PB開始REGEX.IsMatch返回true。

我預想的正則表達式如下所示:

^(?<!PB)\S+(?=MTCH) 

但是這給了我下面的比賽:

PB-GD2185-11652- 
GD2185-11652- 
KD-GD2185-11652- 

我不明白爲什麼負回顧後不僅不排斥匹配但包含比賽中的PB字符。積極的預測按預期工作。

編輯1

讓我先從一個簡單的例子。下面的正則表達式匹配的所有字符串,因爲我會期待它:

\S+ 

下面的正則表達式也可以匹配所有的字符串,儘管我希望它不要:

\S+(?!MTCH) 

下面的正則表達式匹配所有但前三串最後^ h字符:

\S+(?<!MTCH) 

從正則表達式101的文檔,先行查找文本模式的權利和回顧後升ooks用於模式左側的文本,所以在字符串的開始處有一個向前看的文檔不會隨文檔一起跳動。

編輯2

再舉一個例子具有以下三個字符串:

grey 
greyhound 
hound 

正則表達式:

^(?<!grey)hound 

僅匹配最終獵犬。而正則表達式:

^(?<!grey)\S+ 

匹配所有三個。

回答

0

問題是因爲\ S +的貪婪。當處理lookaround和貪婪的量詞時,你可以輕鬆地匹配比你期望的更多的字符。要解決這個問題的一種方法是插入一個負環視一組與貪婪的量詞排除它作爲一個匹配在這個問題說:

How to non-greedy multiple lookbehind matches

,並在這個有用的網站貪婪正則表達式:

http://www.rexegg.com/regex-quantifiers.html

請注意,這第二個鏈接有幾種其他方式來處理各種情況下的貪婪。

對於這種情況的一個很好的正則表達式如下:

^(?<!PB)((?!PB)\S+)(MTCH) 
1

您需要一個預見:^(?!PB)\S+(?=MTCH)。使用後視意味着PB必須在第一個字符之前出現。

+0

PB確實有來的第一個字符之前,換言之,它始終是字符串的 – Eric

+0

我確實得到相同的結果開始與前瞻。 – Eric

+0

'var result = new Regex(@「(?! PB)^ \ S +(?= MTCH)」)。IsMatch(「PB-GD2185-11652-MTCH」);''result'爲'false'。 – Shlomo

0

在這樣它將會更加清晰的情況下在代碼中做邏輯。因此,首先檢查是否匹配字符串MTCH,然後它不匹配^PB