#!/usr/bin/perl
use strict;
use warnings;
my $s = "sad day
Good day
May be Bad Day
";
$s =~ s/\w+ \w+/_/gm;
print $s;
単語間のすべてのスペースを _ に置き換えようとしていますが、うまくいきません。それの何が問題なのですか?
#!/usr/bin/perl
use strict;
use warnings;
my $s = "sad day
Good day
May be Bad Day
";
$s =~ s/\w+ \w+/_/gm;
print $s;
単語間のすべてのスペースを _ に置き換えようとしていますが、うまくいきません。それの何が問題なのですか?
この置換は、単語全体 ( \w+
)、次にスペース、さらに別の単語をアンダースコアに置き換えます。
それらの言葉を置き換える(または重要なことのためにキャプチャする)必要は本当にありません
$a=~s/\b +\b/_/gm;
\b
は、単語区切り ( 、単語と非単語の間のゼロ幅遷移) の後に 1 つ以上のスペースが続き、その後に別の単語区切り (アンダースコア) が続くものに置き換えられます。を使用\b
すると、改行の前後のスペースを置換しないことが保証されます。
このパターン置換は、おそらく最も効率的なソリューションです。
$a =~ s/\b \b/_/g;
この質問は、明示的な先読みと後読みのアサーションを含む回答なしでは完了しません。
$s =~ s/(?<=\w) (?=\w+)/_/g
これは、ゼロ幅の単語境界アンカーを含むソリューションと実質的に同じ\b
です。
先読み正規表現は任意の文字長の正規表現と一致できますが、後読み正規表現は固定長である必要があることに注意してください(これが(?<=\w+)
できない理由です)。