首页 > 解决方案 > 忽略正则表达式中的组匹配

问题描述

帮助使用正则表达式(javascript 风格):

这第一个正则表达式(我称之为“引号正则表达式”)将匹配匹配引号(单/双)之间的所有内容:/((?<quote>["']).*?\k<quote>)/i

然后我有这个(让我们称之为“标签正则表达式”)/(?<=\s?)\S+:((?<quote>["']).*?\k<quote>|\(.*?\)|.*?(?=\s)|.*)/i::

   This should match:
    tag:something
    tag:"something in double quotes"
    tag:'something in single quotes'
    tag:(between brackets)
    [tag] -> can be any word

我需要的是从“引用正则表达式”的结果中忽略“标记正则表达式”

我尝试了消极/积极的前瞻/后视,但它要么匹配所有内容,要么什么都不匹配......

有趣的是,在不应该匹配的内容和应该匹配的内容之间使用换行符(?

https://regex101.com/r/1KEHfW/1

我正在分享一个指向 regex101 的链接,它的“工作”,但我在第一行放了一个换行符,如果你删除它停止工作的断行。

标签: javascriptregexregex-lookaroundsregex-groupregex-negation

解决方案


你这里有问题:

    tag:"something in double quotes"
    tag:'something in single quotes'

您已经指定了一个贪婪的通配符聚合器*,因此您无法区分它在下面一行中从第一个"到最后一个匹配的引号配对类型。'要匹配引号对,您需要指定如下内容:

\"[^"]*\"|\'[^']*\'|\([^\)]*\)

这意味着三种选择之一:

  • 双引号,后跟不等于双引号的任意数量的字符,后跟双引号。
  • 或单引号,后跟不等于单引号的任意数量的字符,后跟单引号。
  • 或左括号,后跟不等于右括号的任意数量的字符(请参阅下面的注释),然后是右括号。

如果您缩短正则表达式以考虑任何类型的引号,那么引号不会相互配对,并且您会在模式识别中引入 Wild 空间。

注意: 如果你打算嵌套括号,就像在算术表达式中一样,有一个坏消息,因为正则表达式可以匹配任意正则语言,但是一种允许嵌套结构的语言,比如括号引入的结构,不是正则的,而是上下文无关的,并且您可以设计(以及正则表达式)以匹配嵌套括号的任何语法都必须将嵌套深度限制在固定的有界限制内。我不建议您遵循使用正则表达式来解析绑定有限表达式的方法,因为正则表达式的大小在最大边界嵌套级别下增长非常快。


推荐阅读