先読み(?=...)と後読みを使用して、数字の前後(?<=...)に非数字があることをアサートできます。これにより、そのような囲まれた番号が削除されます。
$str =~ s{ (?<=\D) (\d+) (?=\D) }{}xg;
別の置換を与えることも、実行されるコードを与えることもできます。可変長の場合X:
$str =~ s{(?<=\D) (\d+) (?=\D)}{ "X" x length $1 }xge;
/e置換を実行しx、あまり使用されていない繰り返し演算子です。
以下は、そのような数列をすべて削除した文字列を返すサブルーチンです。オプションで最小長と最大長を指定できます。
use Carp;
sub remove_numbers {
my ($string, $min, $max) = @_;
$min //= 1;
$max //= "";
croak qq(argument \$min is not valid) if $min =~ /[^0-9]/;
croak qq(argument \$max is not valid) if $max =~ /[^0-9]/;
$string =~ s/(?<=\D) (\d{$min,$max}) (?=\D)/"X" x length $1/xge;
return $string;
}
呼び出し
$str = remove_numbers($str, 5, 5);
と同等$str =~ s/(?<=\D)(\d{5})(?=\D)/XXXXX/です。呼び出し
$str = remove_numbers($str);
私の2番目のコード例と同等です。