我們可以用一個超前(?=...)
和回顧後(?<=...)
斷言,數字前面和後面的非數字。這將消除這種封閉的數字:
$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