对整个嵌套正则表达式

时间:2016-08-11 23:17:24

标签: regex

我有((.*)\n)*?stopcondition

的正则表达式

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

例如

a
b
stop condition

变为

a
b
changed condition

另一个例子:

a
b
c
d
stop condition

变为

a
b
c
d
changed condition

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

我目前正在编写2个正则表达式来处理前两行和前四行的情况。

我是否缺少一些语法糖来获得对整场比赛的参考?

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

2 个答案:

答案 0 :(得分:2)

这个怎么样:

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

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

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

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

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

答案 1 :(得分:1)

想象一下((.*)\n)*?stopcondition。{/ p>

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

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

即使它包含需要之前的内容stopcondition 它只是在没有任何修改的情况下被替换。

在这种情况下,由于您使用的是Perl,请使用\K构造 (注意 - 其他一些使用PCRE或其风格的引擎都有这种结构 以及它的兄弟(*跳过)(*失败)

定义:
\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>在() *?的每个量化传球上被覆盖 所以,你只能看到最后一次传球上的匹配。

然而,

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

第1组未量化,并且包含组的整体积累 2和3被覆盖。

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