perlの「_」の前にあるすべての文字を削除するにはどうすればよいですか?したがって、「124312412_hithere」という文字列がある場合、その文字列は「hithere」として置き換えられます。正規表現を使用してこれを行う非常に簡単な方法があると思いますが、私はまだそれを扱うのが新しいので、ここで助けが必要です。
4 に答える
_" "までのすべての文字を削除します。
s/^[^_]*_//;
_" "の前のすべての文字を削除します。
s/^[^_]*(?=_)//;
" " の前のすべての文字を削除します_(" " が存在すると仮定します_):
s/^[^_]*//;
これは必要以上に冗長ですが、何が起こっているのかを確認する価値があるでしょう:
my $astring = "124312412_hithere";
my $find = "^[^_]*_";
my $replace = "_";
$astring  =~ s/$find/$replace/;
print $astring;
また、質問には少し矛盾する要件があります。hithere(先頭の なしで)必要な場合は、次の_ように変更します。
$astring  =~ s/$find//;
尋ねられたものとは少し違うことは知っていますが、このような場合(探している文字が文字列に存在することを知っている場合)、私は使用することを好みますsplit:
$str = '124312412_hithere';
$str = (split (/_/, $str, 2))[1];
ここでは、区切り文字として「_」を使用して文字列を部分に分割していますが、最大2つの部分に分割しています。次に、2番目の部分をに戻し$strます。
このソリューション(/ _ /)にはまだ正規表現がありますが、これは、文字クラスや条件付き一致などでいっぱいの正規表現よりも、読んで理解するのがはるかに簡単なソリューションだと思います。
これを試すことができます: -
$_ = "124312412_hithere";
s/^[^_]*_//;
print $_;    # hithere
これにより、も削除されることに注意して_ください(サンプル出力から推測したとおり)。を保持したい場合_(最初のステートメントで何を望んでいるのか疑わしいため)、おそらくlook-ahead@ikegamiの回答のように使用する必要があります。
また、もう少し明確にするために、正規表現での置換とマッチングはデフォルトで on に適用されます$_。$_したがって、明示的にバインドする必要はありません。それは暗示されています。
したがって、s/^[^_]*_//;基本的には - と同じです$_ =~ s/^[^_]*_//;が、後者は実際には必要ありません。