Java 我在这个正则表达式中做错了什么?
我有一个关于Regex的学校作业。我先解释一下 我必须编写一个用于检查URL的正则表达式,我必须检查的条件是: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时,它仍然会通过,这
- 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)$