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

时间:2018-01-11 14:09:01

标签: java regex

我正在接受关于正则表达式的学校作业。我先解释一下。

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

  • 网址是http(s)还是ftp(s)?

  • 域名是.nl还是.edu?

  • 至少有一个第三级域名,但如果该域名以 万维网。必须有第四级域名。

这是我目前的正则表达式:

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

我的网址是:

http://www.lib.hva.nl

网址目前正在传递正则表达式,但是当我删除.lib或.hva时,它仍会传递,而且不会发生。什么时候有www。在域中域应该有四个级别。有人可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:9)

可以在+

之后使用所有格量词(www\.)?解决此问题
(https?|ftps?):\/\/(www\.)?+[a-z]+\.[a-z]+\.(nl|edu)$

解释

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

匹配

http://www.lib.nl

因为在(www\.)?之前发动机回溯失败并且[a-z]+.匹配www.匹配成功后,为了避免回溯(www\.)?,可以使用积极量词。

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

can be checked on regex101

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

您还可以使用{n}来确切地发生n次,有时可能更具可读性。您可以轻松增加子域数量。

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