2

我将如何在 perl 中删除“_”之前的所有字符?因此,如果我有一个字符串“124312412_hithere”,它会将字符串替换为“hithere”。我想有一种非常简单的方法可以使用正则表达式来做到这一点,但我还是新手,所以我需要帮助。

4

4 回答 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 回答