Perl正则表达式最后一次出现

时间:2012-05-04 16:15:56

标签: regex perl non-greedy

我有这个输入:

AB2.HYNN.KABCDSEG.L000.G0001V00
AB2.HYNN.GABCDSEG.L000.G0005V00

我想删除字符串中GXXXXVXX完成的所有内容。

当我使用此代码时:

$result  =~ s/\.G.*V.*$//g;
print "$result \n";

结果是:

AB2.HYNN.KABCDSEG.L000
AB2.HYNN

每次正则表达式找到".G"时,它都会被删除。 我不明白。

我想有这个:

AB2.HYNN.KABCDSEG.L000
AB2.HYNN.GABCDSEG.L000

我如何在正则表达式中执行此操作?

2 个答案:

答案 0 :(得分:0)

$result =~ s/\.G\d+V\d+//g;

适用于给定的输入。

答案 1 :(得分:0)

<强>更新

在评论中谈到后,最终的解决方案是:

s/\.G\w+V\w+$//;

在你的正则表达式中:

s/\.G.*V.*$//g;

那些.*贪婪且会尽可能匹配。您唯一的要求是V之后必须有一个.G,因此它会截断它找到的第一个.G字符串,只要它跟着一个V。这里不需要/g修饰符,因为发生的任何匹配都将删除字符串的其余部分。除非您有换行符,否则.与没有/s修饰符的换行符不匹配。