正则表达式以简短的副本查找网址

时间:2015-07-30 20:07:21

标签: javascript regex

有一个简短的副本我需要匹配所有出现的网站链接。为了简单起见,需要找到这种格式的地址:

www.aaaaaa.bbbbbb
http://aaaaaa.bbbb
https://aa.bbbb

但我还需要处理更长的www / http / https版本:

www.aaaaa.bbbb.ccc.ddd.eeee

等。所以基本上不知道子域的数量。现在我想出了这个正则表达式:

(www\.([a-zA-Z0-9-_]|\.(?!\s))+)[\s|,|$]|(http(s)?:\/\/(?!\.)([a-zA-Z0-9-_]|\.(?!\s))+)[\s|,|$]

如果你测试:

this is some tex with www.somewIebsite.dfd.jhh.hjh inside of it or maybe http://www.ssss.com or maybe https://evenore.com hahaah blah

除了地址在最后时,它工作正常。 $似乎只有在最后有\ n并且失败时才会起作用:

this is some tex with www.somewIebsite.dfd.jhh.hjh

我猜修复很简单,我想念一些明显的东西,我该如何解决呢?顺便说一下,如果你想快速玩https://regex101.com/r/eL1bI4/3

,我在这里发布正则表达式

1 个答案:

答案 0 :(得分:1)

问题是您将结束锚$放在角色组[]

[\s|,|$]

然后按字面解释为美元符号,而不是锚点(管道符|也按字面解释,在那里不需要)。解决方案是将$锚移到外面:

(?:[\s,]|$)

但是,在这种情况下,使用正向前瞻而不是非捕获组更有意义(您不需要尾随空格或逗号):

(?=[\s,]|$)

在结果中,您将得到以下正则表达式模式:

(www\.([a-zA-Z0-9-_]|\.(?!\s))+)(?=[\s,]|$)|(http(s)?:\/\/(?!\.)([a-zA-Z0-9-_]|\.(?!\s))+)(?=[\s,]|$)

请参阅the working demo

处理尾随句号的更新版本:

(www\.([a-zA-Z0-9-_]|\.(?!\s|\.|$))+)(?=[\s,.]|$)|(http(s)?:\/\/(?!\.)([a-zA-Z0-9-_]|\.(?!\s|\.|$))+)(?=[\s,.]|$)

请参阅the working demo