URL Guesser RegExp优化

时间:2012-11-15 21:09:01

标签: regex url coffeescript

我写了一个非常重要的正则表达式,用于coffee-script项目。它旨在获取大量用户文本(消息,帖子,散文)并找到所有潜在的URL,尽可能贪婪。

urlGrabber = ///
  (\s|^)                              # Start after a whitespace or string[0]
  ([a-zA-Z]+\://)?                    # Captures any protocol (just not //)
  (\w+:\w+@)?                         # Username:Password
  ([a-zA-Z\d-]|[a-zA-Z\d-]\.)*        # Subdomains
  [a-zA-Z\d-]{2,}                     # Domain name
  \.                                  # THE DOT
  ([a-zA-Z]{2,4}(:\d+)?)              # Domain Extension with Port
  ([/\?\#][\S/]*)*                    # Some Request, greedy capture
  \b                                  # Last word boundary
  /?                                  # Optional trailing Slash
///g

我遇到像abc.mno.st.u.xvy这样的字符串问题,其中abs.mno.st被解析为字符串。这根本不应该被捕获。 <{1}}获取as.ds.d.也是如此。

有人可以解释为什么会发生这种情况和/或帮助解决修复所需的更改吗?

1 个答案:

答案 0 :(得分:1)

使用正则表达式

(?:\s+|^)                                                   # leading spaces
([a-zA-Z]+://|)                                             # protocol
(\w+:\w+@|)                                                 # username:password@
((?:[a-zA-Z\d]+(?:-[a-zA-Z\d]+)*\.)*)                       # subdomain(s)
([a-zA-Z\d]+(?:[a-zA-Z\d]|-(?=[a-zA-Z\d]))*[a-zA-Z\d])      # domain
(\.[a-zA-Z]{2,4})                                           # .top-level-domain
(:\d+|)                                                     # :port
(/\S*|)                                                     # rest of url
(?!\S)

注意:子域名和域名不能以-开头和结尾,也不应该有--加号{除非你想支持Punnycode IDN domain names)。