我将如何在 perl 中删除“_”之前的所有字符?因此,如果我有一个字符串“124312412_hithere”,它会将字符串替换为“hithere”。我想有一种非常简单的方法可以使用正则表达式来做到这一点,但我还是新手,所以我需要帮助。
问问题
11790 次
4 回答
6
删除直到并包括 " _
" 的所有字符:
s/^[^_]*_//;
删除 " _
" 之前的所有字符:
s/^[^_]*(?=_)//;
删除 " _
" 之前的所有字符(假设存在 " _
"):
s/^[^_]*//;
于 2012-12-12T19:26:40.413 回答
5
这比它需要的要冗长一些,但对于您了解正在发生的事情可能更有价值:
my $astring = "124312412_hithere";
my $find = "^[^_]*_";
my $replace = "_";
$astring =~ s/$find/$replace/;
print $astring;
此外,您的问题中存在一些相互矛盾的要求。如果您只想hithere
(没有前导_
),请将其更改为:
$astring =~ s/$find//;
于 2012-12-12T19:10:14.260 回答
2
我知道这与所要求的略有不同,但在这种情况下(您知道要查找的字符存在于字符串中)我更喜欢使用split
:
$str = '124312412_hithere';
$str = (split (/_/, $str, 2))[1];
在这里,我将字符串拆分为多个部分,使用“_”作为分隔符,但最多为 2 个部分。然后,我将第二部分分配回$str
.
这个解决方案中仍然有一个正则表达式(/_/),但我认为这是一个比充满字符类、条件匹配等的正则表达式更容易阅读和理解的解决方案。
于 2012-12-12T19:33:05.323 回答
1
你可以试试这个: -
$_ = "124312412_hithere";
s/^[^_]*_//;
print $_; # hithere
请注意,这也将删除_
(正如我从您的示例输出中推断的那样)。如果您想保留_
(因为根据您的第一个陈述,您想要什么似乎值得怀疑),您可能需要使用look-ahead
@ikegami 的答案。
另外,为了更清楚一点,正则表达式中的任何替换和匹配都默认应用于$_
. 因此,您无需将其$_
显式绑定。这是暗示的。
因此,s/^[^_]*_//;
本质上与 - 相同$_ =~ s/^[^_]*_//;
,但实际上并不需要后者。
于 2012-12-12T19:12:53.800 回答