我该如何使用Perl正则表达式去除换行符?

3

当我运行时:

perl -e '$x="abc\nxyz\n123"; $x =~ s/\n.*/... multiline.../; printf("str %s\n", $x);'

我希望结果是:

str abc... multiline...

但实际收到的是

str abc... multiline...
123

我哪里做错了?

2个回答

7
$x =~ s/\n.*/... multiline.../s

/s修改符号告诉Perl将匹配的字符串视为单行,这将导致.可以匹配换行符。通常情况下它不会匹配换行符,从而导致您观察到的行为。


1
据我所知,Perl不使用PCRE。 PCRE是一个库,用于模仿Perl正则表达式语法。 - obecalp
我的意思是 PCRE,不是特定的库,而是包括 Perl 在内的通用的兼容 Perl 的正则表达式引擎集合。也许我使用不当了。 - chaos
1
那么我们应该如何为与PCRE库相关的问题打标签呢? 无论如何,并非所有“Perl兼容”的正则表达式风格都使用/s(或/m、/i等)。没有正则表达式文字的语言,如Python、Java和.NET,使用编译标志而非像“DOTALL”或“SingleLine”这样的标志。 - Alan Moore

2
您需要在正则表达式中使用's'修饰符,这样点号'.'将匹配任何后续的换行符。因此,代码如下:
$x =~ s/\n.*/... multiline.../;

变成这样:

$x =~ s/\n.*/... multiline.../s;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接