【问题标题】:non-capturing group in regular expressions正则表达式中的非捕获组
【发布时间】:2020-02-22 09:43:17
【问题描述】:

这是我的字符串:

补救

将 codecov 升级到 3.6.5 或更高版本。

参考文献

GitHub 提交

这是我的正则表达式:

(?=Remediation)[^\n]*[\s\S]*?(?=References|$)

匹配输出:

修复将 codecov 升级到 3.6.5 或更高版本。

我不需要输出中的标题(“Remediation”)。我已经把?= 加到群里了,但是目前还不行。

我该怎么做?

【问题讨论】:

  • 为什么不直接用空白字符替换Remediation
  • 我还有很多标题,但我只需要“补救”和“参考”之间的内容。
  • 你使用什么语言?
  • 您使用什么语言/工具?来自regex tag info:“由于正则表达式尚未完全标准化,所有带有此标签的问题还应包含一个指定适用的编程语言或工具的标签。”

标签: regex


【解决方案1】:

在您的模式中,您从 (?= 开始,这是一个积极的前瞻断言。

一种选择是更新模式以将其更改为积极的后视。您可以省略[^\n]*,因为下面的[\s\S]*? 也会匹配它。

(?<=Remediation)[\s\S]*?(?=References)

Regex demo

另一种选择是匹配补救措施,并在一个组中捕获所有不以引用开头的行,以取消否定前瞻。

\bRemediation\s*\r?\n((?:(?!References).*)+)

Regex demo

【讨论】:

    【解决方案2】:
    (?:Remediation\s*)([\s\S]*?)(?:\s+References)
    

    会成功的。 (?:) 没有捕获。您也可能不想在修复之后或引用之前捕获空格,因此我将 \s* 添加到非捕获组中。 demo

    或根据评论,您可以消除无捕获语法并执行以下操作:

    Remediation\s*([\s\S]*?)\s+References
    

    demo

    这里是第 1 组

    【讨论】:

    • 非捕获组在这里没用。
    猜你喜欢
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 2019-01-12
    • 1970-01-01
    • 2014-02-22
    相关资源
    最近更新 更多