【问题标题】:Issue matching exact word发出匹配确切字词
【发布时间】:2019-05-13 14:32:30
【问题描述】:

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

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

我的正则表达式:(http(s?)://www.|www.|http(s?)://)+[a-z0-9]+([-.]{1} [a-z0-9]+).[a-z]{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 等。

【问题讨论】:

  • 如果blaggg 是现有的TLD,http://www.blahttps://www.ggg将是正确的URL。例如,https://www.gghttps://www.xyz 是正确的 URL
  • 您很可能希望转义 [a-z]{2,5} 之前的 .,以便它只匹配实际的点而不是任何字符(但正如 @Seblor 所说,这仍然会使 URL 验证器变得很差)
  • 如果您使用支持所有格量​​词的正则表达式实现,https?://(?:www.)?+[a-z0-9]+\.[a-z]{2,5}(:[0-9]{1,5})?(/.)? 看起来可以满足您的需求。如果您使用支持负前瞻的正则表达式实现,https?://(?:www.)?(?!www)[a-z0-9]+\.[a-z]{2,5}(:[0-9]{1,5})?(/.)? 也会这样做(两者都确保[a-z0-9]+www 不匹配)
  • 我注意到我的正则表达式中有两个错误:1)在两个正则表达式中,(?:www.) 中的 . 应该被转义; 2)在第二个正则表达式中,负前瞻也应该匹配.(也转义),这样它就不会阻止匹配http://wwwaaahhhooo.com

标签: regex


【解决方案1】:

你可以使用

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

regex demo

详情

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-16
    • 2019-10-23
    相关资源
    最近更新 更多