Regex Perl将连续的空行替换为s/^\s*$/<;p>/转基因的
我正在读一本关于正则表达式的书,这里有一个例子 人们希望用Regex Perl将连续的空行替换为s/^\s*$/<;p>/转基因的,regex,perl,Regex,Perl,我正在读一本关于正则表达式的书,这里有一个例子 人们希望用替换每个连续的空行 以下是脚本: undef $/; $text = <>; $text =~ s/^\s*$/<p>/gm; undf$/; $text=; $text=~s/^\s*$//gm; 这里是输入A\n\n\n\nB\n,它与A然后是3个空行,然后是B相同 我希望它输出A\nB\n,因为\s包含换行符,并且在第二行的开始和第四行的结束后重复 但是输出是A\n\nB\n 另外,无论我在A和B之间放
替换每个连续的空行
以下是脚本:
undef $/;
$text = <>;
$text =~ s/^\s*$/<p>/gm;
undf$/;
$text=;
$text=~s/^\s*$//gm;
这里是输入A\n\n\n\nB\n
,它与A然后是3个空行,然后是B相同
我希望它输出A\nB\n
,因为\s
包含换行符,并且在第二行的开始和第四行的结束后重复
但是输出是A\n\nB\n
另外,无论我在A
和B
之间放了多少空白行,我总是得到相同的答案
但是当输入是
A\n\n\n[]\nB\n
([]-表示空格字符)时,我得到了某种正确的输出A\n\nB\n
,但是为什么在之后仍然有\n
?这里有两个问题。尾随的换行符和两个
尾随换行符
(?m:$)
在换行符之前和字符串末尾匹配。这意味着替换的文本后面必然会有换行符或字符串的结尾\n应使用而不是$
两个
这个问题是您的模式能够匹配零个字符的结果
Your string: AB
Positions: 0123456
您的模式找到两个匹配项
- 您的模式将从位置2开始的2个字符替换为
- 您的模式将从位置4开始的0个字符替换为
修正:
s/\n{2,}/\n/g
或
s/\n\s*\n/\n/g#允许换行之间使用空格。
我明白了,起初我认为$
是在换行之后,然后我认为^
和$
在这条路上被消耗掉了。有人告诉我,$
也可以在\n
之后匹配,这在这种情况下不起作用吗?我测试了(^\s*$)\n
,它也起作用。这是更好的解决方案吗?Re“有人告诉我,$
也可以在\n
之后匹配”,正如我已经说过的,(?m:$)
($
当m
修饰符生效时)在换行之前和字符串末尾匹配。((?-m:$)
匹配的位置较少:在字符串末尾的换行之前和字符串末尾。)Re“这是更好的解决方案吗”,可读性要差得多。现在还不清楚它是干什么的。事实上,它是误导性的,因为它看起来像是一条线。
s/\n{2,}/\n<p>/g
s/\n\s*\n/\n<p>/g # Allows whitespace between the newlines.