说我有以下字符串:
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+
匹配所有三个。
答案 0 :(得分:1)
您需要前瞻:^(?!PB)\S+(?=MTCH)
。使用look-behind意味着PB
必须在第一个字符之前。
答案 1 :(得分:0)
问题是因为\ S +的贪婪。在处理外观和贪婪量词时,您可以轻松匹配比预期更多的字符。处理此问题的一种方法是在具有贪婪量词的组中插入负面外观,以将其排除为此问题中所述的匹配项:
在这个有用的网站上关于正则表达式中的贪婪:
请注意,第二个链接还有一些其他方法可以解决各种情况下的贪婪。
这种情况的正常表达如下:
^(?<!PB)((?!PB)\S+)(MTCH)
答案 2 :(得分:0)
在这样的情况下,在代码中逻辑地执行它会更清楚。因此,首先检查字符串是否与MTCH
匹配,然后确定它是否与^PB