【问题标题】:Perl regex subsitute last occurrencePerl 正则表达式替换最后一次出现
【发布时间】:2012-05-04 16:15:55
【问题描述】:

我有这个输入:

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

我如何在正则表达式中做到这一点?

【问题讨论】:

    标签: regex perl non-greedy


    【解决方案1】:

    更新:

    在cmets中谈过,最终的解决办法是:

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

    在你的正则表达式中:

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

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

    【讨论】:

    • 谢谢,它有效。但它只有在 G 和 V 之间以及 V 之后有数字时才有效。如果没有数字,正则表达式如何工作?
    • @Patrick 那么您的要求必须更加具体。您可以使用 \.G...V..$ 来匹配 3 个和 2 个通配符。您可以使用 .G.{0,3}V{0,2}$ 匹配 0 到 3 和 0 到 2 个通配符。由于你没有提到那里可以有什么样的字符,我无法告诉你如何匹配它们。
    • 比如这个:AB2.HYNN.GABCDVEG.L000.GA1CDV6I在表达式GXXXXVXX,XX可以是数字或字母?
    • 我建议先用行得通的东西,然后再解释坏掉的东西。 :)
    【解决方案2】:
    $result =~ s/\.G\d+V\d+//g;
    

    适用于给定的输入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-12
      • 1970-01-01
      • 2021-07-18
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      相关资源
      最近更新 更多