2012-12-12 29 views
2

我將如何去除perl中「_」之前的所有字符?所以如果我有一個字符串是「124312412_hithere」,它會將字符串替換爲「hithere」。我想有一個非常簡單的方法來使用正則表達式,但我仍然是新的處理,所以我需要幫助。使用正則表達式在perl中刪除最多_

+2

'[^ _] * _'是你的正則表達式。第一部分匹配下劃線的所有內容,_匹配它自己。 –

+0

'my @var = split(/ _ /,$ str); $ str = $ var [1];' –

+0

@BradKoch - 不完全。你忘了一個*或一個+修飾符。您的正則表達式目前只匹配一個非下劃線,後跟一個下劃線。現在我看起來像個瘋子:-) –

回答

3

這是一個有點更詳細的比它需要,但將可能更有價值給你看這是怎麼回事:

my $astring = "124312412_hithere"; 
my $find = "^[^_]*_"; 
my $replace = "_"; 

$astring =~ s/$find/$replace/; 

print $astring; 

此外,還有一點在你的問題相互衝突的要求。如果你只是想hithere(不帶前導_),然後將其更改爲:

$astring =~ s/$find//; 
+0

完美謝謝! – Twisterz

+0

當你的模式以'^'開頭時,'/ g'有點沒有'/ m'。 –

+0

@ OlegV.Volkov修復! –

1

你可以試試這個: -

$_ = "124312412_hithere"; 
s/^[^_]*_//; 
print $_; # hithere 

注意,這也將刪除_(我推斷從您的示例輸出)。如果你想保留_(因爲你的第一條陳述似乎令人懷疑你想要什麼),你可能需要使用look-ahead作爲@ ikegami的答案。

此外,爲了使其更清楚一點,在正則表達式中的任何替換和匹配都默認應用於$_。所以,你不需要明確地將它綁定到$_。這是暗示的。

因此,s/^[^_]*_//;基本上與 - $_ =~ s/^[^_]*_//;相同,但稍後不需要。

+0

對於不熟悉正則表達式的人,他會理解你的正則表達式在$ _上運行嗎?我認爲如果您使用以下內容會更清楚: $ str =「124312412_hithere」; $ str =〜s/^ [^ _] * _ // g; –

+0

@TimA ..你走了。我添加了一些內容,使其更加清晰。 –

6

刪除所有字符,直到達到幷包括 「_ 」:

s/^[^_]*_//; 

_ 」之前刪除所有字符:

s/^[^_]*(?=_)//; 

_」 之前,取出所有字符(假設的存在「_」):

s/^[^_]*//; 
1

我知道它比被要求略有不同,但在這樣的情況下(在那裏,你知道你要找的字符的字符串中存在的話)我更喜歡使用split

$str = '124312412_hithere'; 
$str = (split (/_/, $str, 2))[1]; 

在這裏,我分割字符串成零件,使用'_'作爲分隔符,但最多爲2個部分。然後,我將第二部分分配回$str

目前仍然在這個解決方案正則表達式(中/ _ /),但我認爲這是一個非常簡單的解決方案,以閱讀和理解比正則表達式充滿個性的課程,有條件的火柴等

+0

這隻有在字符串最初包含'_'時纔有效。絕對不是我的首選解決方案,因爲你通常需要添加一個冗餘的'if/_ /'或者其他的。 – ikegami