代码之家  ›  专栏  ›  技术社区  ›  John

regex与带引号的perl匹配

  •  0
  • John  · 技术社区  · 6 年前

    我正在读取一个文件,我想找到一个时间戳值,并在将其输出到另一个文件之前将其替换为0。所以我试图搜索并替换此值TIME=“20180731.5622743” 像这样的文件 TIME=“00000000.0000000”

    到目前为止我。。

    open(INPUT, $path) or die $!;
    open(OUTPUT, ">$susex_path")  or die $!;
    
    while(<INPUT>){
       $line =~ s/([0-9]+8.[0-9]+7)/000000.0000000/g;
       print OUTPUT $line;
       }
    }
    close(INPUT);    
    close(OUTPUT);
    

    搜索和替换仅部分工作,因为该行包含我不想替换的其他时间戳。如果我包含要搜索和替换的完整位,则引号似乎会阻止搜索和替换成功。。例如(

    $line =~ s/TIME=\"([0-9]+8.[0-9]+7)\"/TIME=\"00000000.0000000\"/g
    

    非常感谢您的帮助

    2 回复  |  直到 6 年前
        1
  •  0
  •   Matt.G    6 年前

    试试正则表达式: (?<=TIME=")\d{8}\.\d{7}(?=")

    Demo

        2
  •  0
  •   JGNI    6 年前

    试试这个可能更快

    $line =~ s/TIME="[0-9]{8}\.[0-9]{7}"/TIME="00000000.0000000"/g
    

    请注意,如问题注释中所述,您还需要{8}和{7}而不是+8和+7 " 两边都不特别 s/// .

    然而 . 是特殊的,需要逃离;你也不需要 ( ... ) 除非您想使用regex之外的原始时间戳