我正在关注关于正则表达式的书,并且有例子在哪里
一个人希望用<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
。
同样,无论我在A
和B
之间放置多少空白行,我总能得到相同的答案。
但是当输入为A\n\n\n[ ]\nB\n
([] - 表示空格字符时)我会得到一些正确的输出A\n<p>\nB\n
,但为什么\n
之后会出现<p>
?
答案 0 :(得分:1)
这里有两个问题。尾随换行符和两个<p>
。
(?m:$)
在换行符之前和字符串末尾匹配。这意味着您替换的文本必然后跟换行符或字符串的结尾。应该使用\n
代替$
。
<p>
这个问题是你的模式能够匹配零个字符的结果。
Your string: AB
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.