我们可以用一个超前(?=...)
和回顾后(?<=...)
断言,数字前面和后面的非数字。这将消除这种封闭的数字:
$str =~ s{ (?<=\D) (\d+) (?=\D) }{}xg;
我们可以给不同的替代,甚至将要执行的代码。这里用于可变长度X
:
$str =~ s{(?<=\D) (\d+) (?=\D)}{ "X" x length $1 }xge;
/e
执行替代,和x
是未充分利用的重复操作符。
这里是返回移除所有这样的数字序列的字符串,具有可选的最小和最大可能lenth的子程序:
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);
将等同于我的第二个代码示例。
你知道N前锋吗?在我的解决方案中,我使用了5,但是问题是动态依赖于输入还是你已经知道而没有猜测的东西? – mvp