如果我有一个带有新行的输入,例如:
[INFO]
xyz
[INFO]
如何使用
$
拉出 xyz 部分 anchor ?我尝试了像 /^\[INFO\]$(.*?)$\[INFO\]/ms
这样的模式,但 perl 给了我:Use of uninitialized value $\ in regexp compilation at scripts\t.pl line 6.
有没有办法关闭插值,以便 anchor 按预期工作?
编辑:关键是行尾 anchor 是一个美元符号,但有时可能需要在模式中穿插行尾 anchor 。如果模式是内插的,那么您可能会遇到诸如未初始化
$\
之类的问题。 .例如,这里可接受的解决方案是 /^\[INFO\]\s*^(.*?)\s*^\[INFO\]/ms
但这并没有解决第一个问题的症结。我已将 anchor 更改为 ^
所以没有进行插值,有了这个输入,我可以自由地做到这一点。但是当我真的想用 $
引用 EOL 时怎么办?在我的模式?如何让正则表达式编译?
最佳答案
问题是学术性的——不需要 $
无论如何 anchor 定在你的正则表达式中。您应该使用 \n
匹配换行符,因为 $
只匹配换行符和它之前的字符之间的间隙。
编辑:我想说的是你永远不需要使用 $
那样。从一行到下一行的任何匹配都必须以某种方式消耗行分隔符。考虑你的例子:
/^\[INFO\]$(.*?)$\[INFO\]/ms
如果编译成功,
(.*?)
将首先消耗第一个换行符并继续直到它匹配 \nxyz
,其中第二个 $
会成功。但是下一个字符是换行符,正则表达式正在寻找 [
,所以这不起作用。回溯后,(.*?)
会不情愿地再消耗一个字符——第二个换行符——但随后是 $
会失败。任何时候您尝试将 EOL 与
$
匹配时然后还有更多的东西,你必须匹配的第一个“东西”将是换行符,那么为什么不匹配它呢?这就是为什么 Perl 正则表达式编译器试图解释 $\
作为正则表达式中的变量名称:行尾 anchor 后跟不是行分隔符的字符是没有意义的。
关于regex - 如何在没有插值的情况下在正则表达式中多次匹配行尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2876569/