如何修改正则表达式以匹配URL时排除末尾的点
如何修改正则避免匹配URL时包含末尾的点?
你遇到的这个问题很典型——原正则里的[^"<>\\s]+会匹配所有除了引号、尖括号、空格的字符,自然就会把URL末尾跟着的句号也误包含进去。咱们可以通过调整匹配逻辑,允许URL中间的点,但禁止末尾出现标点来解决这个问题。
修改后的正则表达式
const urlReg = /((\w*?)((:\/\/)|www|\w\.{1}\w{2,})(?:[^"<>.\s]|\.(?=[^"<>.\s]))+)(?![^<>]*>|[^"]*?<\/a)/g;
原理说明
我把原正则里的[^"<>\\s]+替换成了(?:[^"<>.\s]|\.(?=[^"<>.\s]))+,这个表达式的逻辑拆解如下:
[^"<>.\s]:匹配任意不是引号、尖括号、句号、空格的字符|\.(?=[^"<>.\s]):或者匹配一个句号,但这个句号后面必须跟着一个有效字符(非引号、尖括号、句号、空格),确保这个点是URL中间的组成部分,而非末尾的标点- 整个分组用
(?:...)包裹(非捕获组),+表示匹配一次或多次这样的字符组合
这样修改后,正则会自动停在URL的有效结尾,不会把后面跟着的句号、空格等无关标点包含进去。
如果你偏好更简洁的写法,也可以用非贪婪匹配结合边界判断:
const urlReg = /((\w*?)((:\/\/)|www|\w\.{1}\w{2,})[^"<>\\s]+?(?=[.\s"<>]|$))(?![^<>]*>|[^"]*?<\/a)/g;
这里的[^"<>\\s]+?是非贪婪模式,一旦遇到句号、空格、引号、尖括号或者字符串结尾就停止匹配,同样能达到排除末尾标点的效果。
内容的提问来源于stack exchange,提问作者Michael Lonin
相关产品推荐
相关产品推荐

