Regex Negative Lookbehind Matches Lookbehind text .NET

时间:2016-09-27 18:24:58

标签: regex regex-lookarounds

说我有以下字符串:

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)

从regex 101的文档中,前瞻查找模式右侧的文本,lookbehind查找模式左侧的文本,因此在字符串的开头有一个前瞻不会与文档一起生成。

修改2

以另外三个字符串为例:

grey
greyhound
hound

正则表达式:

 ^(?<!grey)hound 

只匹配最后一只猎犬。而正则表达式:

^(?<!grey)\S+ 

匹配所有三个。

3 个答案:

答案 0 :(得分:1)

您需要前瞻:^(?!PB)\S+(?=MTCH)。使用look-behind意味着PB必须在第一个字符之前。

答案 1 :(得分:0)

问题是因为\ S +的贪婪。在处理外观和贪婪量词时,您可以轻松匹配比预期更多的字符。处理此问题的一种方法是在具有贪婪量词的组中插入负面外观,以将其排除为此问题中所述的匹配项:

  

How to non-greedy multiple lookbehind matches

在这个有用的网站上关于正则表达式中的贪婪:

  

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

请注意,第二个链接还有一些其他方法可以解决各种情况下的贪婪。

这种情况的正常表达如下:

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

答案 2 :(得分:0)

在这样的情况下,在代码中逻辑地执行它会更清楚。因此,首先检查字符串是否与MTCH匹配,然后确定它是否与^PB

匹配