【问题标题】:Perl search and replace the last character occurrencePerl 搜索并替换最后出现的字符
【发布时间】:2011-09-25 23:37:31
【问题描述】:

我有一个我认为很容易解决的问题,但我无法找到答案。

如何查找和替换字符串中最后一次出现的字符?

我有一个字符串:GE1/0/1,我希望它是:GE1/0:1

说明: 我希望用 : 替换最后一个 / ,无论它之前或之后是什么。

【问题讨论】:

    标签: regex perl replace


    【解决方案1】:
    use strict;
    use warnings;
    my $a = 'GE1/0/1';
    (my $b = $a) =~ s{(.*)/}{$1:}xms;
    print "$b\n";
    

    我使用.*的贪婪行为

    【讨论】:

      【解决方案2】:

      也许我不明白可变长度的问题,但我会做以下事情:

      你可以用正则表达式匹配你想要的:

      (.+)/
      

      所以,这个 Perl 脚本

      my $text = 'GE1/0/1';
      $text =~ s|(.+)/|$1:|;
      print 'Result : '.$text;
      

      将输出:

      Result : GE1/0:1
      

      “+”量词默认为“贪婪”,它只会匹配最后一个斜线字符。

      希望这就是你要问的。

      【讨论】:

        【解决方案3】:

        这会找到一个斜线并向前看以确保没有更多的斜线经过它。:

        原始正则表达式:

        /(?=[^/]*$)
        

        我认为代码看起来像这样,但 perl 不是我的语言:

        $string =~ s!/(?=[^/]*$)!\:!g;
        

        【讨论】:

          【解决方案4】:

          “字符串中的最后一次出现”有点模棱两可。在我看来,你的意思可以是:

          "Foo: 123, yada: GE1/0/1, Bar: null"
          

          表示“单词”GE1/0/1 中的最后一次出现,或者:

          "GE1/0/1" 
          

          作为一个完整的字符串。

          在后一种情况下,这是一件相当简单的事情,您只需要决定您在正则表达式中的具体程度。

          $str =~ s{/(\d+)$}{:$1};
          

          完全没问题,假设最后一个字符只能是数字。

          在前一种情况下,我不认为你指的是,但无论如何我都会包括在内,你需要更具体:

          $str =~ s{(\byada:\s+\w+/\w+)/(\w+\b)}{$1:$2};
          

          【讨论】:

            猜你喜欢
            • 2014-07-08
            • 1970-01-01
            • 2015-10-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-12-11
            • 2011-07-26
            相关资源
            最近更新 更多