Regex负lookback与lookback text.NET匹配
假设我有以下字符串:Regex负lookback与lookback text.NET匹配,regex,regex-lookarounds,Regex,Regex Lookarounds,假设我有以下字符串: PB-GD2185-11652-MTCH GD2185-11652-MTCH KD-GD2185-11652-MTCH KD-GD2185-11652 \S+(?<!MTCH) grey greyhound hound 如果字符串中包含MTCH且不以PB开头,我希望REGEX.IsMatch返回true 我希望正则表达式如下所示: ^(?<!PB)\S+(?=MTCH) 我不明白为什么反向查找不仅不排除匹配,而且在匹配中包含PB字符。积极的前瞻工作如预期
PB-GD2185-11652-MTCH
GD2185-11652-MTCH
KD-GD2185-11652-MTCH
KD-GD2185-11652
\S+(?<!MTCH)
grey
greyhound
hound
如果字符串中包含MTCH且不以PB开头,我希望REGEX.IsMatch返回true
我希望正则表达式如下所示:
^(?<!PB)\S+(?=MTCH)
我不明白为什么反向查找不仅不排除匹配,而且在匹配中包含PB字符。积极的前瞻工作如预期的那样
编辑1
让我从一个更简单的例子开始。下面的正则表达式与我所期望的所有字符串匹配:
\S+
以下正则表达式仍然匹配所有字符串,尽管我希望它不会匹配:
\S+(?!MTCH)
以下正则表达式与前三个字符串中除最后一个H字符外的所有字符匹配:
PB-GD2185-11652-MTCH
GD2185-11652-MTCH
KD-GD2185-11652-MTCH
KD-GD2185-11652
\S+(?<!MTCH)
grey
greyhound
hound
正则表达式:
^(?<!grey)hound
^(?<!grey)\S+
^(?)?
只匹配最后一只猎犬。而正则表达式:
^(?<!grey)hound
^(?<!grey)\S+
^(?)?
匹配所有三个。您需要一个前瞻:^(?!PB)\S+(?=MTCH)
。使用look-behind意味着PB
必须位于第一个字符之前。问题在于\S+的贪婪性。在处理lookarounds和贪婪量词时,您可以轻松匹配比预期更多的字符。解决这一问题的一种方法是在具有贪婪q的组中插入否定lookaroundsuantifier将其排除在本问题所述的匹配之外:
在这个关于正则表达式贪婪性的有用网站上:
注意,第二个链接还有一些其他的方法来处理各种情况下的贪婪
对于这种情况,一个好的正则表达式如下所示:
^(?<!PB)((?!PB)\S+)(MTCH)
^(?在这样的情况下,在代码中进行逻辑操作会更加清晰。因此,首先检查字符串是否匹配MTCH
,然后检查它是否匹配^PB
PB必须位于第一个字符之前,换句话说,它始终是字符串的开头。实际上,我用l得到的结果是相同的ookahead.var result=new Regex(@“(!PB)^\S+(?=MTCH)”).IsMatch(“PB-GD2185-11652-MTCH”);
result
为false
。它完全匹配regex101:/这在代码中正常工作,但在我尝试过的任何Regex设计器中都不能正常工作。