regex 如何使用Negative lookahead正则表达式匹配复杂字符串?

velaa5lx  于 2023-08-08  发布在  其他
关注(0)|答案(2)|浏览(72)

我正在尝试使用负先行正则表达式匹配正确的字符串。
我希望我的正则表达式接受Domain abcd[.]xyz,而不是Bad URL h[xx]ps://abcd[.]xyzEvil URL h[xx]p://stu[.]abc,我已经尝试了很多方法来实现这一点,但它无处可去。

if (str.matches("^(\\w+\\s+)+(?!h\\S+p(s)?://)(.*)$")
{
   ...
}

字符串
上面的代码实际上接受所有字符串,这是不正确的。谁有更好的鹰眼,告诉我我错过了什么?- 谢谢-谢谢

628mspwn

628mspwn1#

发生这种情况是因为在lookahead阻止模式匹配之后,回溯发生了,并且您的第一组返回了一些东西,并尝试再次匹配。
请仔细查看本例中第一组匹配的内容:https://regex101.com/r/GU7WV4/1
这可以通过以下几种方式解决:
1.可以使用possessive quantifiers。这将防止回溯发生。

^(\w+\s+)++(?!h\S+p(s)?://)(.*)$

字符串
1.您可以只匹配非空白符号为您的(几乎)URL:

^(\w+\s+)+(?!h\S+p(s)?://)(\S*)$


1.您可以使用lookahead来防止匹配,方法稍有不同:

^(?!.*h\S+ps?://\S+$)(\w+\s+)+(.*)$

y3bcpkx1

y3bcpkx12#

您需要一个模式来Assert起始文本,即 * “域”“错误URL”* 和 “恶意URL”
下面的代码将Assert起始文本不是Bad URLEvil URL

^(?!(?:Bad |Evil) URL).

字符串
另外,您可以使用相反的方法,只Assert有效的匹配。

^(?=Domain  ).

相关问题