Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Perl将连续的空行替换为s/^\s*$/<;p>/转基因的_Regex_Perl - Fatal编程技术网

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:    A␤␤␤␤B␤  
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.