【问题标题】:regex match with perl with quotation marks正则表达式与带引号的 perl 匹配
【发布时间】:2018-07-31 23:40:39
【问题描述】:

我正在读取一个文件,我想找到一个时间戳值并将其替换为 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

非常感谢任何帮助

【问题讨论】:

  • [0-9]+8 不是 8 位数字,而是 1 位或多位数字后跟 8。你想要 [0-9]{8}
  • " 没有什么特别之处。你甚至不需要逃避它。

标签: regex perl


【解决方案1】:

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

Demo

【讨论】:

  • 完美。谢谢。
  • 请注意,\d 将匹配超过 [0-9],因为它匹配从 Unicode 版本 9.0 开始为 580 个字符的任何十进制数
【解决方案2】:

试试这个可能更快

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

请注意,如 cmets 中所述,您需要 {8} 和 {7} 而不是 +8 和 +7 并且 "s/// 的任一侧都不是特殊的。

但是.比较特殊,需要转义;你也不需要( ... ),除非你想在正则表达式之外使用原始时间戳

【讨论】:

    猜你喜欢
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    相关资源
    最近更新 更多