Perl用s / ^ \ s * $ / <p> / gm替换连续的空行

时间:2017-03-06 18:18:05

标签: regex perl

我正在关注关于正则表达式的书,并且有例子在哪里 一个人希望用<p>替换每个连续的空白行。

这是脚本:

undef $/;
$text = <>;

$text =~ s/^\s*$/<p>/gm;

这是输入A\n\n\n\nB\n,它与A相同,然后是3个空白行,然后是B.

我希望它输出A\n<p>B\n,因为\s包含换行符,并且在第二行开头和第四行结束后重复。

但输出为A\n<p><p>\nB\n

同样,无论我在AB之间放置多少空白行,我总能得到相同的答案。

但是当输入为A\n\n\n[ ]\nB\n([] - 表示空格字符时)我会得到一些正确的输出A\n<p>\nB\n,但为什么\n之后会出现<p>

1 个答案:

答案 0 :(得分:1)

这里有两个问题。尾随换行符和两个<p>

尾随换行符

(?m:$)在换行符之前和字符串末尾匹配。这意味着您替换的文本必然后跟换行符或字符串的结尾。应该使用\n代替$

两个<p>

这个问题是你的模式能够匹配零个字符的结果。

Your string:    A␤␤␤␤B␤  
Positions:      0123456

您的模式会找到两个匹配项。

  • 您的模式会使用<p>替换位置2的2个字符。
  • 您的模式使用<p>替换从位置4开始的0个字符。

修正:

s/\n{2,}/\n<p>/g

s/\n\s*\n/\n<p>/g   # Allows whitespace between the newlines.