我有((.*)\n)*?stopcondition
这个正则表达式的目的是匹配多个行直到停止条件,然后替换停止条件。
例如
a
b
stop condition
变为
a
b
changed condition
另一个例子:
a
b
c
d
stop condition
变为
a
b
c
d
changed condition
我遇到的问题是对停止条件之前捕获的所有行使用嵌套后向引用。
我目前正在编写2个正则表达式来处理前两行和前四行的情况。
我是否缺少一些语法糖来获得对整场比赛的参考?
如果我在这种情况下使用标准的$ back引用,它将匹配在停止条件之前找到的最后一行。
答案 0 :(得分:2)
这个怎么样:
^((?:.|\n)*\n)stop condition
(替换为:$1changed condition
)
这将查找一行的开头,后跟任意数量的字符或换行符,然后查找换行符和停止条件。内部组是一个非捕获组((?:stuff)
),因为我们只关心捕获之前发现的所有内容。
如果你不关心从一行的开头开始并且停止条件在它自己的行上,你可以使用稍微简单的
((?:.|\n)*)stop condition
虽然stop condition
是一个在文件中没有其他地方出现的唯一字符串,但您可以直接搜索并替换stop condition
和changed 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