我们可以使用前瞻(?=...)
和后瞻(?<=...)
来断言数字在非数字之前和之后。这将删除这些封闭的数字:
$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);
相当于我的第二个代码示例。