JavaScript中如何创建不区分大小写正则?URL捕获正则匹配异常求助
解决你的正则匹配问题与JS不区分大小写正则的实现
首先,咱们先聊聊你遇到的URL匹配截断问题——为什么goo.gl/uLxP6Z只捕获到u就停了?
你的正则字符集[\da-z\.\-\/~]里只包含小写字母、数字和部分符号,但目标URL里的L、P、Z都是大写字母,不在这个字符集范围内,所以正则匹配到u之后,遇到L就无法继续匹配,自然就截断了。另外,你用的正向预查(?=...)是用来断言后面存在某个模式,但它本身不会捕获内容,这也会导致你没法拿到完整的URL。
修正后的正则表达式
我帮你调整了正则,解决了上述问题,同时合并了两个分支逻辑:
const urlRegex = /<a href="(https?:\/\/[\da-zA-Z.-/~]+|\/[\da-zA-Z.-/~]+)/g;
改动说明:
- 把
a-z扩展为a-zA-Z,支持大小写字母匹配 - 移除了不必要的正向预查,改用直接捕获组来获取完整URL
- 简化了字符集的写法:点
.在字符集里无需转义,横杠-放在末尾也无需转义,让正则更简洁 - 添加了
g修饰符(全局匹配),方便批量提取多个URL
如果需要支持单引号的href属性(比如<a href='xxx'>),可以把引号部分改成["'],正则调整为:
const urlRegex = /<a href=["'](https?:\/\/[\da-zA-Z.-/~]+|\/[\da-zA-Z.-/~]+)/g;
在JavaScript中创建不区分大小写的正则表达式
有两种常用方式:
- 正则字面量加
i修饰符
直接在正则表达式末尾添加i,就会忽略大小写匹配:
// 匹配<a href>时不区分标签大小写(比如<A HREF>也能匹配) const caseInsensitiveRegex = /<a href=["'](https?:\/\/[\da-zA-Z.-/~]+|\/[\da-zA-Z.-/~]+)/gi;
这里的gi是g(全局)+i(不区分大小写)的组合修饰符。
- 使用RegExp构造函数
如果你的正则是动态生成的字符串,可以用RegExp构造函数,第二个参数传入'i':
const pattern = '<a href=["'](https?:\\/\\/[\\da-zA-Z.-/~]+|\\/[\\da-zA-Z.-/~]+)'; const caseInsensitiveRegex = new RegExp(pattern, 'gi');
注意这里字符串里的斜杠需要转义(写成\\/)。
内容的提问来源于stack exchange,提问作者Isaak Johnson
相关产品推荐
相关产品推荐

