7

私は文字列を持っていますfoo_bar_not_needed_string_part_123。この文字列では、 の後にが続くnot_needed_string_part場合にのみ削除します。foo_bar

以下の正規表現を使用しました。

my $str = "foo_bar_not_needed_string_part_123";

say $str if $str =~ s/foo_(?=bar)bar_(.*?)_\d+//;

しかし、文字列全体を削除し、改行だけを出力します。

したがって、一致した (.*?) 部分のみを削除する必要があります。したがって、出力は

foo_bar__123.
4

7 に答える 7

6

別の方法があり、それは非常に簡単です。

my $str = "foo_bar_not_needed_string_part_123";
$str =~ s/(?<=foo_bar_)\D+//gi;
print $str;

トリックは、後読みチェック アンカーを使用し、このアンカーに続くすべての非数字記号(記号ではない) を置き換えることです。基本的に、このパターンでは、削除する必要があるシンボルのみに一致するため、グループをキャプチャする必要はありません。

補足として、元の正規表現(?=bar)bar構造では冗長です。最初の部分 (先読み) は、ある位置の後に 'bar' が続く場合にのみ一致しますが、それはパターンの先読み以外の部分で正確にチェックされるものです。

于 2012-09-16T08:57:32.393 に答える
5

削除したくない部分をキャプチャできます。

my $str = "foo_bar_not_needed_string_part_123";
$str =~ s/(foo_bar_).*?(_\d+)/$1$2/;
print $str;
于 2012-09-16T08:59:07.867 に答える
1

一緒に行く

echo "foo_bar_not_needed_string_part_123" | perl -pe 's/(?<=foo_bar_)[^\d]+//'
于 2012-09-16T11:54:22.970 に答える
1

これを試すことができます:

my $str = "foo_bar_not_needed_string_part_123";

say $str if $str =~ s/(foo_(?=bar)bar_).*?(_\d+)/$1$2/;

出力:

foo_bar__123

PS: 私は初めてなperl/regexので、一致した部分を直接置き換える方法があれば興味があります。私が行ったことは、必要なものをすべてキャプチャし、文字列全体をそれに置き換えたことです。

于 2012-09-16T08:52:33.987 に答える
1

この場合、後読み/先読みを使用できます

$str =~ s/(?<=foo_bar_).*?(?=_\d+)//;

\K後読みを(keep) に置き換えて、少し整理することができます

$str =~ s/foo_bar_\K.*?(?=_\d+)//;
于 2012-09-16T20:08:01.733 に答える
1

これを試して:

(?<=foo_bar_).*(?=_\d)

このバリアントでは、結果にと.*の間の ALL ( ) が含まれます。foo_bar__"any digit"

正規表現では、結果に次が含まれます。

foo_

次に、「foo_」の後に「bar」を探します。

(?=bar)

ただし、このステップでは含まれていません。これは次のステップに含まれます。

bar_

そして、残りの行は に含まれ(.*?)_\d+ます。

したがって、一般的には、式の後に "bar" を探しているだけの EXCEPT (?=bar) という、入力したすべてのものが結果に含まれます。

于 2012-09-16T09:06:30.207 に答える
1

文字列を 3 つに分割し、真ん中だけを削除するとはどういうことでしょうか。

$str =~ s/(foo_(?=bar)bar_)(.*?)(_\d+)/$1$3/;
于 2012-09-16T08:56:52.563 に答える