0

我的理解是,/[^\A] +/mg它将匹配全局的一个或多个空格,而不是在字符串的开头或换行符之后。

显然,我错了。

#!/usr/bin/env perl
use strict;
use warnings;

my $str = "         word1     word2\n     word3     word4     word5\n";
print "str before = $str\n";
$str =~ s/[^\A] +/ /mg;
print "str after  = $str\n";

输出:

str before =          word1     word2
     word3     word4     word5

str after  =  word word2 word word word5

所需的输出是:

str before =          word1     word2
     word3     word4     word5

str after  =          word1 word2
     word3 word4 word5

因此,在数量上保留了前导空格,但在每行开头之后出现的多个空格被减少为一个空格。

perldoc perlretut我没有找到我正在寻找的东西perldoc perlre(即使在搜索了 "[^" with 的所有实例之后/\[\^)。提前谢谢了。

4

3 回答 3

5

在 Perl 中,最简单的解决方案是:s/\S\K +/ /g;

请参阅此演示

于 2012-11-29T00:19:05.400 回答
3

我认为您不能\A在字符类中使用,因为它不是字符。不过,您可以使用两个负面的前瞻:

$str =~ s/(?<!^)(?<! ) +/ /mg;

这确保了比赛既不能在一行的开头也不能在另一个空格之后开始。后一个条件很重要,否则如果您在一行的开头有多个空格,则正则表达式只会从第二个开始匹配。

顺便说一句,为了提高在正则表达式中使用文字空格字符时的可读性,一个巧妙的技巧是将它们包装在一个字符类中:

$str =~ s/(?<!^)(?<![ ])[ ]+/ /mg;

工作演示。

于 2012-11-28T22:56:42.030 回答
0

正如m.buettner所说,正则表达式[...]是一个字符类,只包含字符,而不包含模式。实际上,您的代码会生成警告

Unrecognized escape \A in character class

但是不在行首的一串空格是一串空格,前面有一个非空格,所以你需要写的就是这个。

use strict;
use warnings;

my $str = "         word1     word2\n     word3     word4     word5\n";

print qq(String before = "$str"\n);

$str =~ s/[^ ]\K +/ /g;

print qq(String after = "$str"\n);

输出

String before = "         word1     word2
     word3     word4     word5
"
String after = "  word1 word2
 word3 word4 word5
"
于 2012-11-29T00:03:56.947 回答