[英]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 here
, John 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.