2013-01-16 135 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); 

將等同於我的第二個代碼示例。

相關問題