【问题标题】:Backreference to entire nested regex反向引用整个嵌套的正则表达式
【发布时间】:2016-08-12 09:16:49
【问题描述】:

我有一个 ((.*)\n)*?stopcondition 的正则表达式

这个正则表达式的目的是匹配多行直到停止条件,然后替换停止条件。

例如

a
b
stop condition

变成

a
b
changed condition

另一个例子:

a
b
c
d
stop condition

变成

a
b
c
d
changed condition

我遇到的问题是对停止条件之前捕获的所有行使用嵌套的反向引用。

我目前已经编写了 2 个正则表达式来处理前 2 行和前 4 行的情况。

我是否缺少一些语法糖来获得对整个比赛的引用?

如果我在这种情况下使用标准的 $ 反向引用,它将只匹配在停止条件之前找到的最后一行。

【问题讨论】:

  • 请添加语言标签。
  • 我正在使用 perl 但我不是特定于语言的任何可以实现这一点的就足够了。

标签: regex


【解决方案1】:

这个怎么样:

^((?:.|\n)*\n)stop condition

(替换为:$1changed condition) 这会查找一行的开头,后跟任意数量的字符或换行符,然后是换行符和停止条件。内部组是一个非捕获组 ((?:stuff)),因为我们只关心捕获之前的全部内容。

如果您不关心从行首开始并且停止条件在自己的行上,您可以使用稍微简单一点的

((?:.|\n)*)stop condition

虽然如果stop condition 是一个唯一的字符串,在文件中没有其他地方出现,您可以直接搜索并替换stop conditionchanged condition

【讨论】:

  • 太棒了!我明白为什么这些捕获组现在有用了。
  • 噢,你让我脸红了!很高兴我能帮上忙。如果这有效,请确保将其标记为后代的正确答案。
  • 此外,构建和测试我们的正则表达式的好方法是 regexr.com - 在您学习时特别有用,因为您可以将鼠标悬停在任何字符上并查看它匹配的内容。
  • @IanWatson,如果它解决了您的问题,您应该接受这个答案。
【解决方案2】:

想象一下((.*)\n)*?stopcondition 的含义。

这将匹配stopcondition 之前的任何内容,无论它是什么

所以,((.*)\n)*? 完全无用,因为引擎总是匹配第一个
可用(在源代码中从左到右)正则表达式指定的文字。

即使它包含 需要stopcondition之前的东西
它只是被替换而没有任何修改。

在这种情况下,由于您使用的是 Perl,因此请使用 \K 构造。
注意 - 其他一些使用 PCRE 或其样式的引擎具有这种结构
连同它的兄弟 (*SKIP)(*FAIL)
)

定义:
\K Keep the stuff left of the \K, don't include it in $&

东西被消耗,但不是比赛的一部分。
这确保您匹配正确的stopcondition,但不包括
之前匹配的东西。

查找:((.*)\n)*?\Kstopcondition
替换:changedcondition

现在分析这个((.*)\n)*?

 (                             # (1 start)
      ( .* )                        # (2)
      \n
 )*?                           # (1 end)

()*?
的每个量化传递都会覆盖第 1 组 因此,您只能看到在最 last 通行证上匹配的内容。

然而,

 (                             # (1 start)
      (                             # (2 start)
           ( .* )                        # (3)
           \n 
      )*?                           # (2 end)
 )                             # (1 end)

第 1 组未量化,包含所有组的累积
2 和 3 被覆盖。

附:获取一些知道如何格式化、分析、测试和基准测试正则表达式的软件。
正则表达式.com

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 2018-07-13
    相关资源
    最近更新 更多