我正在接受关于正则表达式的学校作业。我先解释一下。
我必须编写一个用于检查URL的正则表达式,我必须检查的条件是:
网址是http(s)还是ftp(s)?
域名是.nl还是.edu?
至少有一个第三级域名,但如果该域名以 万维网。必须有第四级域名。
这是我目前的正则表达式:
(https?|ftps?):\/\/(www\.)?[a-z]+\.[a-z]+\.(nl|edu)$
我的网址是:
http://www.lib.hva.nl
网址目前正在传递正则表达式,但是当我删除.lib或.hva时,它仍会传递,而且不会发生。什么时候有www。在域中域应该有四个级别。有人可以帮我解决这个问题吗?
答案 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链接)。
答案 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)$