【问题标题】:Matching numbers for substitution in Perl在 Perl 中匹配数字以进行替换
【发布时间】:2013-07-23 11:39:35
【问题描述】:

我有这个小脚本:

my @list = ('R3_05_foo.txt','T3_12_foo_bar.txt','01.txt');

foreach (@list) {
    s/(\d{2}).*\.txt$/$1.txt/;
    s/^0+//;
    print $_ . "\n";
}

预期的输出是

5.txt
12.txt
1.txt

但是,我得到了

R3_05.txt
T3_12.txt
1.txt

最后一个很好,但我无法理解为什么正则表达式在这种情况下给了我$1 的字符串开始。

【问题讨论】:

    标签: regex perl substitution


    【解决方案1】:

    试试这个模式

    foreach (@list) {
        s/^.*?_?(?|0(\d)|(\d{2})).*\.txt$/$1.txt/;
        print $_ . "\n";
    }
    


    说明:

    我在这里使用了分支重置功能(即(?|...()...|...()...)),它允许将多个捕获组放在一个引用中($1 这里)。因此,您避免使用第二个替换来从捕获的左侧修剪零。

    要从数字之前的开头全部删除,我使用:

    .*?     # all characters zero or more times 
            # ( ? -> make the * quantifier lazy to match as less as possible)
    _?      # an optional underscore
    



    请注意,您可以确保只有 2 位数字添加一个前瞻来检查是否没有后面的数字:

    s/^.*?_?(?|0(\d)|(\d{2}))(?!\d).*\.txt$/$1.txt/;
    

    (?!\d) 表示后面没有数字

    【讨论】:

      【解决方案2】:

      这里的问题是你的替换正则表达式没有覆盖整个字符串,所以只有部分字符串被替换。但是对于一个简单的问题,您正在使用一个相当复杂的解决方案。

      看来您想要的是从字符串中读取两位数,然后在其末尾添加.txt。那么为什么不这样做呢?

      my @list = ('R3_05_foo.txt','T3_12_foo_bar.txt','01.txt');
      
      for (@list) {
          if (/(\d{2})/) {
              $_ = "$1.txt";
          }
      }
      

      要克服前导零效应,您可以通过向数字添加零来强制转换为数字:

      $_ = 0+$1 . ".txt";
      

      【讨论】:

        【解决方案3】:

        我会修改你的正则表达式。尝试使用此代码:

        my @list = ('R3_05_foo.txt','T3_12_foo_bar.txt','01.txt');
        
        foreach (@list) {
            s/.*(\d{2}).*\.txt$/$1.txt/;
            s/^0+//;
            print $_ . "\n";
        }
        

        【讨论】:

        • 我之前有过,但我在输出中只得到了一个数字。
        • 确定吗?我的输出: perl test.pl 5.txt 12.txt 1.txt
        【解决方案4】:

        问题是您的s/// 中的第一部分与您认为的匹配,但第二部分并没有取代您认为应该的。 s/// 只会替换之前匹配的内容。因此,要替换 T3_ 之类的内容,您也必须匹配它。

        s/.*(\d{2}).*\.txt$/$1.txt/;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-28
          • 1970-01-01
          • 2017-04-12
          • 2015-03-24
          • 1970-01-01
          • 2011-12-24
          相关资源
          最近更新 更多