2
#!/usr/bin/perl

use strict;
use warnings;

my $s = "sad day
 Good day
 May be Bad Day 
 ";

$s =~ s/\w+ \w+/_/gm;

print $s;

単語間のすべてのスペースを _ に置き換えようとしていますが、うまくいきません。それの何が問題なのですか?

4

3 に答える 3

5

この置換は、単語全体 ( \w+)、次にスペース、さらに別の単語をアンダースコアに置き換えます。

それらの言葉を置き換える(または重要なことのためにキャプチャする)必要は本当にありません

$a=~s/\b +\b/_/gm;

\bは、単語区切り ( 、単語と非単語の間のゼロ幅遷移) の後に 1 つ以上のスペースが続き、その後に別の単語区切り (アンダースコア) が続くものに置き換えられます。を使用\bすると、改行の前後のスペースを置換しないことが保証されます。

于 2010-06-02T12:34:51.697 に答える
3

このパターン置換は、おそらく最も効率的なソリューションです。

$a =~ s/\b \b/_/g;
于 2010-06-02T12:33:09.890 に答える
2

この質問は、明示的な先読みと後読みのアサーションを含む回答なしでは完了しません。

$s =~ s/(?<=\w) (?=\w+)/_/g
  • これは、ゼロ幅の単語境界アンカーを含むソリューションと実質的に同じ\bです。

  • 先読み正規表現は任意の文字長の正規表現と一致できますが、後読み正規表現は固定長である必要があることに注意してください(これが(?<=\w+)できない理由です)。

于 2010-06-02T13:28:34.397 に答える