2016-09-27 99 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