0

私の理解では/[^\A] +/mg、文字列の先頭または改行の直後以外に発生する1つ以上のスペースにグローバルに一致します。

どうやら、私は間違っています。

#!/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

そのため、先頭のスペースの数は保持されますが、各行の先頭の後に発生する複数のスペースは 1 つのスペースに削減されます。

perldoc perlretutnorで探しているものが見つかりませんperldoc perlre(「[^」のすべてのインスタンスを で検索した後でも/\[\^)。よろしくお願いします。

4

3 に答える 3

5

Perl では、最も単純な解決策は次のとおりです。s/\S\K +/ /g;

このデモを参照してください。

于 2012-11-29T00:19:05.400 に答える
3

\A文字ではないので文字クラスでは使えないと思います。ただし、次の 2 つの否定的な先読みを使用できます。

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

これにより、一致が行頭の後でも別のスペースの後でも開始できないことが保証されます。後者の条件は重要です。そうしないと、行の先頭に複数のスペースがある場合、正規表現は単純に 2 番目のスペースから一致を開始します。

ところで、正規表現でリテラル スペース文字を使用するときに読みやすくするための巧妙な方法は、それらを文字クラスでラップすることです。

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

動作デモ。

于 2012-11-28T22:56:42.030 に答える
0

m.buettner言うように、regex like[...]文字クラスであり、パターンではなく文字のみを含みます。実際、コードは警告を生成します

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 に答える