有了一份简短的副本,我需要匹配所有出现的网站链接。为了简单起见,需要找出这种格式的地址:
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
最佳答案
问题在于您将结束 anchor $
放置在字符组 []
内
[\s|,|$]
然后它被字面解释为美元符号,而不是 anchor (管道字符 |
也被字面解释,那里不需要它)。解决方案是将 $
anchor 移到外面:
(?:[\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 .
关于javascript - 正则表达式在简短的副本中查找网址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31733069/