【问题标题】:Ignore matches from group in regex在正则表达式中忽略组中的匹配
【发布时间】:2021-10-08 20:03:40
【问题描述】:

帮助使用正则表达式(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

我需要的是从“quote regex”的结果中忽略“tag regex”

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

有趣的是,使用否定的lookbehind (?

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

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

【问题讨论】:

    标签: javascript regex regex-lookarounds regex-group regex-negation


    【解决方案1】:

    你这里有问题:

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

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

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

    表示三种选择之一:

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

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

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

    【讨论】:

    • 您可能错过了,但我将引号命名为 (?<quote>["']),然后使用反向引用 \k<quote> 来“关闭”正确的引号,即使里面还有另一个。
    • 两个正则表达式都可以工作,我需要的是从引号中排除结果(如果它们在标签内)。 (现在我在 JS 中手动执行此操作,直到找到更好的解决方案)
    • 好吧,一旦你用子表达式ABC 将它们表达为A|B|C,你就可以通过重写正则表达式来创建组并只包含你感兴趣的组如 (A)|(B)|(C) 仅在匹配 A 类型的正则表达式时才匹配 A
    猜你喜欢
    • 1970-01-01
    • 2018-11-04
    • 2018-11-23
    • 2015-11-11
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    相关资源
    最近更新 更多