You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

正则表达式匹配含&且末尾无引号的URL时负前瞻规则失效问题

问题分析

你的正则表达式没达到预期效果,核心有两个关键问题:

  1. 混淆了HTML实体与正则字符逻辑:你用"来指代双引号,但正则根本不识别HTML实体——"在正则里只是匹配"这一串普通字符,完全起不到排除双引号的作用,直接打乱了你的匹配规则。
  2. 负向断言范围太局限:你加的(?!["'])只检查了最后一个分组的后续位置,没有确保整个匹配的URL本身不以引号/引号实体结尾,也没限制URL后面不能紧跟引号,导致末尾带"的URL被匹配了大部分内容。

解决方案

针对你的需求(匹配包含&、且末尾/结尾无单双引号或对应HTML实体的URL),可以使用这个正则:

\b(?:[^'"`\\\s\n]+&amp;[^'"`\\\s\n]+)(?<!['"`])(?<!&(?:quot|#39);)(?!['"`\\\s])(?!&(?:quot|#39);)

正则各部分说明

  • \b:单词边界,确保匹配的是独立完整的URL,避免从字符串中间截断匹配。
  • (?:[^'"\\s\n]+&[^'"\\\s\n]+):非捕获组,专门匹配包含&amp;的URL主体:
    • [^'"\\s\n]+`:匹配除单引号、双引号、反引号、反斜杠、空格、换行之外的任意字符,避免URL本身混入干扰字符。
    • &amp;:精确匹配你需要的与符号HTML实体。
  • (?<!['"])`:负向后行断言,确保URL的最后一个字符不是单/双/反引号。
  • (?<!&(?:quot|#39);):额外的负向后行断言,确保URL末尾不是单/双引号的HTML实体(比如&quot;&#39;)。
  • (?!['"\\s])`:负向前瞻断言,确保URL后面不紧跟单/双/反引号、反斜杠或空格。
  • (?!&(?:quot|#39);):额外的负向前瞻断言,确保URL后面不紧跟引号类HTML实体。

这个正则会完全排除末尾带&quot;的URL,比如你给出的google.com/cool?cool1=yes&amp;cool2=no&amp;cool3=no&quot;会被直接忽略,不会匹配任何部分。

内容的提问来源于stack exchange,提问作者Mohit Kumar

火山引擎 最新活动