我有一种情况,我需要删除(或替换)N个数字,当它们在文字字符之间时。 例如:
00000ASEDF32434VSC
我需要删除32434,以便输出为:
00000ASEDFVSC
如果我想用XXXXX代替32434?
如何使用正则表达式?
修改
我选择了一个非常愚蠢的例子。对不起。 考虑一下:
00000SQWDDWE12CSDCASEDF32434VSC
我需要替换(或删除)模式32434。
一般情况下:如果我有一个字母数字字符串如何
当它们介于两者之间时,删除N(例如5)个数字的模式
文字字符?
感谢。
答案 0 :(得分:2)
在文字字符之间删除N(比如5)数字的模式?
“字面字符”是什么意思?你的意思是“字母”吗?以下内容删除了一个5位数字(0-9)的序列,前面和后面都有一个字母。
$str =~ s/(?<=\pL)[0-9]{5}(?=\pL)//;
免费为变量免费更改5
。
my $n = 5;
$str =~ s/(?<=\pL)[0-9]{$n}(?=\pL)//;
自Perl 5.14 +以来,您可以使用\d
使用[0-9]
来表示/a
。 (没有/a
,\d
匹配超过400个不同的字符。)
$str =~ s/(?<=\pL)\d{5}(?=\pL)//a;
答案 1 :(得分:2)
我们可以使用前瞻(?=...)
和后瞻(?<=...)
来断言数字前面跟着非数字。这将删除这些封闭的数字:
$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 :(得分:1)
使用此代码删除:
$str =~ s/([a-z]+)\d{5}([a-z]+)/\1\2/i;
这将取代:
$str =~ s/([a-z]+)\d{5}([a-z]+)/\1XXXXX\2/i;
其中5是您必须替换的数字。
答案 3 :(得分:1)
您可以拉出相关部件进行更换,然后重新包装。我假设它只是一个数字实例。这样,无论多少都没关系,但你总是用相同数量的'X'代替......
$str = "00000ASEDF32434VSC";
my($prefix, $digits, $suffix) = $str =~ /^(.*[a-z])(\d+)([a-z].*)$/i;
# Replace with X
$str = $prefix . ($digits =~ s/./X/g) . $suffix;
# Or remove
$str = $prefix . $suffix;
你可能想确保正则表达式成功了!
响应您的编辑:您实际上想删除特定号码...
$str = $str =~ s/^(.*[a-z])32434([a-z].*)$/$1XXXXX$2/i;
或者如果您想要5位数(已经回答过)
$str = $str =~ s/^(.*[a-z])\d{5}([a-z].*)$/$1XXXXX$2/i;
答案 4 :(得分:0)
$str =~ s/[1-9]//g
这将删除所有数字1-9。这会有用吗?
$str =~ s/(\D)\d\d*(\D)/$1$2/g
只有当数字在字符串之间时才应该替换,但是如果它起作用则不能确定。