Java 我在这个正则表达式中做错了什么?

Java 我在这个正则表达式中做错了什么?,java,regex,Java,Regex,我有一个关于Regex的学校作业。我先解释一下 我必须编写一个用于检查URL的正则表达式,我必须检查的条件是: URL是http还是ftp 域是.nl还是.edu 至少有一个三级域,但如果域以 www.必须有一个四级域名 以下是我目前拥有的正则表达式: (https?|ftps?):\/\/(www\.)?[a-z]+\.[a-z]+\.(nl|edu)$ 我的网址是: http://www.lib.hva.nl URL当前通过正则表达式,但当我删除.lib或.hva时,它仍然会通过,这

我有一个关于Regex的学校作业。我先解释一下

我必须编写一个用于检查URL的正则表达式,我必须检查的条件是:

  • URL是http还是ftp

  • 域是.nl还是.edu

  • 至少有一个三级域,但如果域以 www.必须有一个四级域名

以下是我目前拥有的正则表达式:

(https?|ftps?):\/\/(www\.)?[a-z]+\.[a-z]+\.(nl|edu)$
我的网址是:

http://www.lib.hva.nl

URL当前通过正则表达式,但当我删除.lib或.hva时,它仍然会通过,这不应该发生。当域中有www.时,域应具有四个级别。有人能帮我解决这个问题吗?

这可以通过在
(www\)之后使用所有格量词
+
来解决

解释

(https?|ftps?):\/\/(www\.)?[a-z]+\.[a-z]+\.(nl|edu)$
火柴

http://www.lib.nl
因为在引擎回溯失败后,直到
(www\)?
和as
[a-z]+。
匹配也
www.
匹配成功,为了避免回溯
(www\)?
,可以使用可能的量词

其他选项可以是使用负前瞻或原子组(如regex101链接)


问题是
[a-z]+
也与
www
匹配。为了防止出现这种情况,请在第一个
[a-z]+
实例之前使用否定的前瞻断言,如下所示:

(https?|ftps?):\/\/(www\.)?(?!www\.)[a-z]+\.[a-z]+\.(nl|edu)$

您还可以将{n}用于恰好n个事件,这有时可能更可读。您可以轻松增加子域数量


(https?| ftps?):\/\/(www\.)?+([a-z]+\.{2}(nl | edu)$

这是因为回溯
[a-z]+
匹配
www
www\.
请注意,无论出于何种原因,如果url以
www.www.
开头,对我来说似乎不会失败。你能进一步解释吗?啊,我现在明白了。这是有道理的。非常感谢!很好!关于量词的一个有用的参考:这是一个非常简洁的解决方案!美好的非常感谢。非常好的插件,使它更短
(https?|ftps?):\/\/(www\.)?(?!www\.)[a-z]+\.[a-z]+\.(nl|edu)$