如何修改正则pattern_for_links以匹配包含末尾斜杠的链接?
解决正则匹配末尾带斜杠的链接问题
刚好碰到过类似的问题,我来帮你搞定这个正则匹配的小bug!
问题分析
你当前的正则表达式:
const pattern_for_links = /((((http|ftp|https):\/{2}|([0-9a-z_-]+\.)+)|)(([0-9a-z_-]+\.)+(com)(:[0-9]+)?((\/([~0-9a-zA-Z\#\+\%@@\.\/_-]+))?(\?[0-9a-zA-Z\+\%@@\/&\[\];=_-]+)?)?))\b/gmi;
可以正常匹配http://www.yahoo.com、yahoo.com/wordss、www.yahoo.com这类链接,但末尾带有斜杠的链接(比如http://www.yahoo.com/、yahoo.com/wordss/、www.yahoo.com/)无法被完整匹配。问题出在正则末尾的\b(单词边界):斜杠不属于单词字符(\w),当链接以斜杠结尾时,\b会把这个斜杠排除在匹配范围外,导致无法捕获。
解决方案
只需要把正则末尾的\b替换为\b\/?即可,修改后的完整正则如下:
const pattern_for_links = /((((http|ftp|https):\/{2}|([0-9a-z_-]+\.)+)|)(([0-9a-z_-]+\.)+(com)(:[0-9]+)?((\/([~0-9a-zA-Z\#\+\%@@\.\/_-]+))?(\?[0-9a-zA-Z\+\%@@\/&\[\];=_-]+)?)?))\b\/?/gmi;
为什么这样修改?
\/?里的?是正则的量词,表示匹配前面的斜杠字符0次或1次。这样既不会影响原有不带斜杠链接的匹配,又能精准捕获末尾带斜杠的链接。- 修改后,正则可以完美匹配以下所有测试用例:
http://www.yahoo.comyahoo.com/wordsswww.yahoo.comhttp://www.yahoo.com/yahoo.com/wordss/www.yahoo.com/
内容的提问来源于stack exchange,提问作者lowdegeneration
相关产品推荐
相关产品推荐

