如何从perl中删除此字符串中的数字?

时间:2013-01-16 01:23:00

标签: regex perl

我有一种情况,我需要删除(或替换)N个数字,当它们在文字字符之间时。 例如:

00000ASEDF32434VSC

我需要删除32434,以便输出为:

00000ASEDFVSC

如果我想用XXXXX代替32434?

如何使用正则表达式?

修改

我选择了一个非常愚蠢的例子。对不起。 考虑一下:

00000SQWDDWE12CSDCASEDF32434VSC

我需要替换(或删除)模式32434。

一般情况下:如果我有一个字母数字字符串如何
当它们介于两者之间时,删除N(例如5)个数字的模式 文字字符?

感谢。

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

只有当数字在字符串之间时才应该替换,但是如果它起作用则不能确定。