2013-01-16 69 views
1

我有一种情况,我需要删除(或替换)N个字符之间的数字。 例如:如何从perl中的这个字符串中删除数字?

00000ASEDF32434VSC

我需要32434被去除,使得输出为:

00000ASEDFVSC

如果我想替换32434与XXXXX?

如何使用正则表达式?

编辑

我选了一个很愚蠢的例子。 考虑一下:

00000SQWDDWE12CSDCASEDF32434VSC

我需要替换(或删除)仅图案32434.

在一般的情况下:如果我的字母数字字符串如何
除去N的图案(说5)数字时,他们之间的文字字符是 ?

谢谢。

+0

你知道N前锋吗?在我的解决方案中,我使用了5,但是问题是动态依赖于输入还是你已经知道而没有猜测的东西? – mvp

回答

0
$str =~ s/[1-9]//g 

这将删除所有数字1-9。这会工作吗?

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

只能在数字在字符串之间进行替换,但不能太确定它是否有效。

+0

我相信他们仍然希望替换每个角色的“X”。因此,您要么提取零件之间的部分,并将其推回到正确数量的“X”中,要么一次只能做一个,直到没有更多匹配为止(因为'X'是一个合法的字母字符。 – paddy

+0

@paddy this主要是对第一部分的回答,但是OP是否需要“X”或任意数字(x为变量) –

+0

噢,是的,我错过了那个部分=) – paddy

1

使用此代码删除:

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

,这取代:

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

其中5是你必须多少个号码代替。

+0

注意'/ i'部分 - 它是为了原因 – mvp

+0

在替换部分中使用'$ 1'和'$ 2',* not *'\ 1'和'\ 2' – ysth

+0

实际上都可以正常工作 – mvp

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; 
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使用/a意味着[0-9]。 (无/a\d超过400个不同的字符匹配。)

$str =~ s/(?<=\pL)\d{5}(?=\pL)//a; 
2

我们可以用一个超前(?=...)和回顾后(?<=...)断言,数字前面和后面的非数字。这将消除这种封闭的数字:

$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); 

将等同于我的第二个代码示例。

相关问题