1

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

00000ASEDF32434VSC

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

00000ASEDFVSC

如果我想用 XXXXX 替换 32434 ?

如何使用正则表达式来做到这一点?

编辑

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

00000SQWDDWE12CSDCASEDF32434VSC

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


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

谢谢。

4

5 回答 5

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+ 开始,您可以使用\dto 来表示[0-9]使用/a. (没有/a,\d匹配超过 400 个不同的字符。)

$str =~ s/(?<=\pL)\d{5}(?=\pL)//a;
于 2013-01-16T01:45:43.000 回答
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);

相当于我的第二个代码示例。

于 2013-01-16T01:47:39.763 回答
1

使用此代码删除:

$str =~ s/([a-z]+)\d{5}([a-z]+)/\1\2/i;

这要替换:

$str =~ s/([a-z]+)\d{5}([a-z]+)/\1XXXXX\2/i;

其中 5 是您必须替换的数字数量。

于 2013-01-16T01:28:23.683 回答
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;
于 2013-01-16T01:35:05.650 回答
0
$str =~ s/[1-9]//g

这将删除所有数字 1-9。这行得通吗?

$str =~ s/(\D)\d\d*(\D)/$1$2/g

仅当数字在字符串之间时才应替换,但不太确定它是否有效。

于 2013-01-16T01:25:32.827 回答