繁体   English   中英

REGEXP:捕获组未跟随

[英]REGEXP: capture group NOT followed by

我需要匹配以下语句:

Hi there John
Hi there John Doe (jdo)

没有匹配这些:

Hi there John Doe is here 
Hi there John is here

所以我认为这个正则表达式可行:

^Hi there (.*)(?! is here)$

但它没有 - 我不知道为什么 - 我相信这可能是由捕获组(。*)引起的,所以我认为可能让*运算符懒惰会解决问题......但是没有。 这个正则表达式也不起作用:

^Hi there (.*?)(?! is here)$

任何人都能指出我的解决方案吗?

要检索句子没有 is here结束时(如Hi there John Doe (the second) ),你应该使用(作者@Thorbear):

^Hi there (.*$)(?<! is here)

对于包含中间某些数据的句子(如Hi there John Doe (the second) is hereJohn Doe(第二个)是所需数据)简单分组就足够了:

^Hi there (.*?) is here$

           ╔══════════════════════════════════════════╗
           ║▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒║
           ║▒▒▒Everyone, thank you for your replies▒▒▒║
           ║▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒║
           ╚══════════════════════════════════════════╝

.*会发现一个匹配而不管是贪婪的,因为在这一行的最后,没有跟随is here (自然)。

对此的解决方案可能是使用lookbehind(从行的末尾检查,如果过去的几个字符匹配在is here )。

^Hi there (.*)(?<! is here)$

编辑

正如Alan Moore所建议的那样,进一步将模式更改为^Hi there (.*$)(?<! is here)将提高模式的性能,因为捕获组将在尝试向后看之前吞噬其余的字符串,从而节省您不必要的回溯。

从你的例子中可以看出,如果你想阻止“在这里”发生在任何地方或者只是在一条线的末尾。 如果它不应该发生在任何地方,试试这个:

^Hi there ((?! is here).)*$

举个例子

在每个字符之前,它会检查下一个字符是否“在这里”。

或者,如果您只想在行的最末端将其排除,则可以使用负面的lookbehind,如Thorbear建议的那样:

^Hi there (.*)(?<! is here)$ 

你的表达式匹配所有输入行是完全正确的。 .*匹配一切,前瞻(?! is here)$永远是真的,因为“在这里”永远不会发生一行之后(因为什么都没有)。

你不需要用正则表达式来解决你的问题,你只需要使用正则表达式来找出非预期的正则表达式是否匹配。 当然,如果您已经知道这一点,并且只是想了解前瞻/外观,那么您可以放弃其余的答案。

如果您使用正则表达式, 则不希望输入字符串匹配:

badregex = (Hi there (.*)(is here))

这会给你一个匹配

Hi there, John is here

所以你可以把逻辑放在应用程序级别,它应该在哪里(正则表达式中的逻辑是一件坏事)。 一点伪代码(我现在写出Java,但你明白了)

if (badregex.exactMatch(your_str))
   discardString();
   return;
if (goodregex.exactMatch(your_str))
   doStuff(your_str);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM