regex - Perl模式匹配变量问题

标签 regex perl backreference

我正在尝试打开一个文件,匹配特定的行,然后将 HTML 标记包裹在该行周围。看起来非常简单,但显然我遗漏了一些东西并且没有正确理解 Perl 匹配模式变量。

我正在匹配这条线:

$line =~ m/(Number of items:.*)/i;

将整行放入 $1。然后我尝试像这样打印出我的新行:

print "<p>" . $1 . "<\/p>;

我希望它打印这个:

<p>Number of items: 22</p>

但是,我实际上得到了这个:

</p>umber of items: 22

我尝试了各种变体 - 在单独的行上打印每一位,将 $1 设置为新变量,使用 $+ 和 $& 等,我总是得到相同的结果。

我错过了什么?

最佳答案

你的比赛中有一个\r,打印时会导致格式错误的输出。

编辑: 为了进一步解释,您的文件很可能具有 Windows 样式的\r\n 行结尾。 chomp 不会删除\r,它随后会被吞噬到你贪婪的匹配中,并导致令人不快的输出(\r 意味着返回到行的开头并继续打印)。

您可以通过添加类似

的内容来删除\r
$line =~ tr/\015//d;

关于regex - Perl模式匹配变量问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4609202/

相关文章:

php - 正则表达式,preg_match_all模式中的反向引用问题

java - 如何使用字符串替换的反向引用作为 Java 中 HashMap 的键?

r - 如何在stringi包中使用反向引用?

regex - 正则表达式 anchor list

java - 正则表达式仅匹配一次,而不是全部

javascript - 正则表达式:如何在 javascript (ES6) 中匹配韩语(韩文)字母?

perl - 逐位读取二进制文件

perl - Perl 中的递归 grep

javascript - jQuery 验证中的正则表达式 - 需要一个包含 5 位数字和 1 个字母的数字(字母不区分大小写)

xml - 清除子处理程序中的 XML Twig