1

我正在构建一个可以匹配 url 的网站验证器正则表达式。

问题是,它 90% 有效!它进出我的字符串匹配,这就是问题所在。

我的正则表达式:(http(s?)://www.|www.|http(s?)://)+[a-z0-9]+([-.]{1}[a-z0-9 ]+) .[az]{2,5}(:[0-9]{1,5})?(/. )?

我要测试的字符串:

1)(这应该失败,但它通过了) https://www.xy

2)(这应该通过,它确实)https://www.xy.com

它不断进入我的组 (http(s?)://) 而不是组 ((http(s?)://www.)

关于如何解决这个问题的任何想法?

我要传递的网址:

http://www.test.com

http://test.com

https://test.com

https://www.test.com

我想失败的网址: http://www.bla https://www.ggg

所以,如果它匹配https://www。或http://www。它应该使用正确的组,然后应用正则表达式的其余部分来检查它是否包含.. test.com 等。

这是使用正确的组 这是使用错误的组

4

1 回答 1

1

您可以使用

^(?:https?:\/\/)?(?!www\.[^.]+$)(?:www\.)?[a-z0-9]+(?:[-.][a-z0-9]+)*\.[a-z]{2,5}(?::[0-9]{1,5})?(\/.*)?$

查看正则表达式演示

细节

  • ^- 字符串的开始
  • (?:https?:\/\/)?- 一个可选的http://https://
  • (?!www\.[^.]+$)- 如果在当前位置的右侧有一个否定的前瞻,则匹配失败www.,然后在字符串末尾有除点之外的任何 1+ 个字符
  • (?:www\.)?- 一个可选的www.
  • [a-z0-9]+- 1+ 小写字母和数字
  • (?:[-.][a-z0-9]+)*- 0 次或多次重复-or.然后 1+ 小写字母和数字
  • \.- 一种.
  • [a-z]{2,5}- 两到五个小写字母
  • (?::[0-9]{1,5})?- 可选的:1 到 5 位数字序列
  • (\/.*)?- 可选序列/和该行的其余部分
  • $- 字符串的结尾。
于 2019-05-14T08:19:22.993 回答