Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex负lookback与lookback text.NET匹配_Regex_Regex Lookarounds - Fatal编程技术网

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设计器中都不能正常工作。