正则表达式试图避免“不匹配”并始终匹配

时间:2019-01-11 12:26:56

标签: regex regex-negation regex-lookarounds

我有一个正则表达式来检查与传递(供应)问题有关的消息。 我使用的正则表达式是\b(problem(s|)|issue(s|)) (([^\n \.]*? ){1,3}?)(suppl(y|ies)|parcel|deliver(y|))\b,其中(([^\n \.]*? ){0,3}?)的作用就像一个1到3个单词的窗口

这与以下文本匹配:

  1. 从来没有有供应交付或服务的问题

  2. 从未遇到过交付方面的问题

  3. 获取我的用品的问题太多

问题在于前2个文本中有一个我要处理的never前面。

我尝试使用负前瞻,并对正则表达式\b(?!never)((?:[^\n \.]+? ){2,2}?)(problem(s|)|issue(s|)) (([^\n \.]*? ){1,3}?)(suppl(y|ies)|parcel|deliver(y|))\b使用了以下更改,该更改与第一文本不匹配,但与第二和第三文本匹配

正则表达式\b(?!never)((?:[^\n \.]+? ){3,3}?)(problem(s|)|issue(s|)) (([^\n \.]*? ){1,3}?)(suppl(y|ies)|parcel|deliver(y|))\b与第一和第三匹配,与第二文本不匹配。

将这两个正则表达式\b(?!never)((?:[^\n \.]+? ){2,3}?)(problem(s|)|issue(s|)) (([^\n \.]*? ){1,3}?)(suppl(y|ies)|parcel|deliver(y|))\b组合在一起后,所有3个文本都将匹配。

因此,基本上,当never是原始匹配项之前的第二个单词时,正则表达式采用3个单词并匹配的窗口,而当never是原始匹配项之前的第三个单词时,则正则表达式采用一个2个匹配的窗口。

匹配项如下:

  1. 从未遇到过供应交付或服务方面的问题

  2. 从不送货有问题

  3. 获取我的用品太多问题

就好像正则表达式试图尽可能地始终匹配。 Link to example

这是正则表达式的一般行为吗?

还有,有没有办法解决这个问题?

谢谢。

0 个答案:

没有答案