【问题标题】:How to change this regular expression to only match urls?如何将此正则表达式更改为仅匹配 url?
【发布时间】:2017-11-28 14:15:24
【问题描述】:

我想检查包含 url 的字符串是否匹配,例如:

http://www.something.com

www.something.com

something.com

我有这个正则表达式(.Net 风格)来匹配 url:

((http|ftp|https|www)://)?(\w+?\.\w+)+([a-zA-Z0-9\~\!\@\#\$\%\^\&\*\(\)_\-\=\+\\\/\?\.\:\;\'\,]*)?

它应该适用于以上 3 个 url,但不幸的是它也匹配这个:

35.000

如何修复正则表达式,使其不匹配 35.000?

【问题讨论】:

  • 只过滤掉不包含字母的匹配项,如果您在.NET中提取文本应该很容易。
  • 作为旁注,您可以将(http|ftp|https|www) 更改为(https?|ftp|www),并且您的长列表不需要转义每个字母,您可以使用\w 而不是a-zA-Z0-9_,从而使用@987654328而是@。
  • url 语法非常复杂。尝试使用单一模式完成所有工作并不是一个好主意,原因有两个:1)如果您编写处理所有可能情况的最终模式,它将不可读且速度慢。 2)如果你写一个简单的模式,你会错过url,你会匹配不是url的子字符串。结论,选择一个折中方案:一个简单的、非常宽松的模式 + 一个内置的 url 检查器来过滤结果。
  • 顺便说一句,模式中的www 分支永远不会匹配www.brinch.org,但会匹配www://brinch.org

标签: regex


【解决方案1】:

这是一个非常方便的正则表达式,它匹配 URL 并将协议、主机、路径、查询和片段分别放入组 1、2、3、4 和 5。它还匹配主机部分中的 IP 地址和主机名。除了主机之外的所有内容都是可选的。

(?:(https?|ftp)://)?(\d{1,3}(?:\.\d{1,3}){3}|(?:\w+\.)*[a-z]+)(/[^?#\s]*)(\?[^#\s]*)?(#[^\s]*)?

如您所见,它非常宽松。它只是检查整体结构,而不实际验证 URL 的各个部分(编码等)。但它会匹配任何正确的 URL,所以它应该足够好。如果用于 Javascript,只需转义 / 斜杠,它应该可以正常工作。

试试here

【讨论】:

  • 如果我尝试使用 www.example.com,它不匹配。
猜你喜欢
  • 2015-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多