JavaScript正则匹配URL末尾恰好2次右括号的实现问题
JavaScript URL正则匹配末尾恰好2个右括号的解决方案
最终可用正则
/(?<![a-zA-Z/]+)(https?:)?\/{1,2}[a-zA-Z][^:"'\);,\s]*(?:\){2}(?!\))?/g
原正则问题根源
你之前使用的\S*是贪婪匹配规则,会无差别吃掉所有连续的右括号,后置的肯定环视仅校验了末尾存在2个右括号,无法限制右括号的总数量不超过2,因此出现3个及以上右括号时会全部纳入匹配结果。
正则逻辑说明
- 开头部分
(?<![a-zA-Z/]+)(https?:)?\/{1,2}[a-zA-Z]保留了你的原有逻辑,用于匹配URL的协议和开头域名部分 - 中间部分
[^:"'\);,\s]*匹配所有非终止符(你原规则里的:"';,)、非右括号、非空白的URL主体内容,不会提前吃掉末尾的右括号 - 末尾可选非捕获组
(?:\){2}(?!\))?用于判断右括号数量:\){2}匹配连续2个右括号- 后置否定环视
(?!\))保证这2个右括号之后不会出现第三个右括号,严格限制数量为恰好2个 - 不满足该条件时不会匹配任何末尾的右括号,符合1个或3个及以上右括号时不纳入匹配的要求
测试验证
和你给出的预期结果完全匹配:
- 输入末尾带1个右括号的URL:匹配到最后一个非右括号字符,不会包含末尾的1个右括号
- 输入末尾带2个右括号的URL:完整匹配包含末尾2个右括号的全URL
- 输入末尾带3个及以上右括号的URL:匹配到最后一个非右括号字符,不会包含任何末尾的右括号
该正则无需使用^/$锚点,可直接在全局复杂文本中提取符合要求的URL,适配你的使用场景。
内容的提问来源于stack exchange,提问作者LeWolfie
相关产品推荐
相关产品推荐

