有一个简短的副本我需要匹配所有出现的网站链接。为了简单起见,需要找到这种格式的地址:
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
,我在这里发布正则表达式答案 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。