我正在尝试使用负先行正则表达式匹配正确的字符串。
我希望我的正则表达式接受Domain abcd[.]xyz
,而不是Bad URL h[xx]ps://abcd[.]xyz
或Evil URL h[xx]p://stu[.]abc
,我已经尝试了很多方法来实现这一点,但它无处可去。
if (str.matches("^(\\w+\\s+)+(?!h\\S+p(s)?://)(.*)$")
{
...
}
字符串
上面的代码实际上接受所有字符串,这是不正确的。谁有更好的鹰眼,告诉我我错过了什么?- 谢谢-谢谢
2条答案
按热度按时间628mspwn1#
发生这种情况是因为在lookahead阻止模式匹配之后,回溯发生了,并且您的第一组返回了一些东西,并尝试再次匹配。
请仔细查看本例中第一组匹配的内容:https://regex101.com/r/GU7WV4/1
这可以通过以下几种方式解决:
1.可以使用possessive quantifiers。这将防止回溯发生。
字符串
1.您可以只匹配非空白符号为您的(几乎)URL:
型
1.您可以使用lookahead来防止匹配,方法稍有不同:
型
y3bcpkx12#
您需要一个模式来Assert起始文本,即 * “域”、“错误URL”* 和 “恶意URL”。
下面的代码将Assert起始文本不是
Bad URL
或Evil URL
。字符串
另外,您可以使用相反的方法,只Assert有效的匹配。
型