2012-12-12 35 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