regex - 如何在没有插值的情况下在正则表达式中多次匹配行尾?

标签 regex perl interpolation

如果我有一个带有新行的输入,例如:

[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/

相关文章:

python - 在 python 中对插值函数 (interp1d) 进行积分

windows - Windows 7 上的 Perl 5.16 无法安装模板工具包

linux - 当 perl cgi 脚本中的 setuid 位打开时,param 不起作用

java - 使用正则表达式将字符串拆分为一些字符和转义序列

regex - 如何批量将前置年份移动到文件名的末尾?

perl - 在perl -e行之后使用花括号的目的是什么

javascript - 通过采样/插值减少大型数据集的大小以提高图表性能

python - 给定一维输入时,scipy interp2d/bisplrep 出现意外输出

javascript - 正则表达式 : numbers and few special characters

java - 正则表达式 - 解析类路径位置