我写了一个非常重要的正则表达式,用于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.
也是如此。
有人可以解释为什么会发生这种情况和/或帮助解决修复所需的更改吗?
答案 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)。