【问题标题】:Perl Search and Replace — issues is caused by "\"Perl 搜索和替换——问题是由“\”引起的
【发布时间】:2014-04-25 18:21:13
【问题描述】:

我正在解析一个文本文档并替换一些文本。似乎找到并替换了没有“\”的文本行没有问题。

顺便说一下,这是在 Perl 中完成的

我有一个如下字符串:

Path=S:\2014 March\Test Scenarios\load\2014 March

包含“\”的斜线是个问题。我正在使用简单的搜索和替换代码行

$nExit =~ s/$sMatchPattern/$sFullReplacementString/; 

我该怎么做?

【问题讨论】:

    标签: perl search str-replace


    【解决方案1】:

    我怀疑您正在尝试匹配文字字符串,因此需要转义正则表达式特殊字符。

    您可以使用quotemeta 或转义码\Q ... \E 来做到这一点:

    $nExit = s/\Q$sMatchPattern/$sFullReplacementString/; 
    

    上面的变量$sMatchPattern会被插值,但是任何特殊字符都会在正则表达式编译之前被转义。因此$sMatchPattern 的值将被视为文字字符串。

    【讨论】:

      【解决方案2】:

      这个字符串是输入的,还是嵌入到你的程序中的。您可以这样做以摆脱反斜杠字符:

      my $path = "S:/2014 March/Test Scenarios/load/2014 March";
      

      顺便说一句,文件名和路径名中最好不要有空格。在某些情况下,它们可能会有点问题。如果你不能消除它们,那是可以理解的。

      你应该看两件事:

      1. 使用quotemeta 可以帮助引用字符串中的特殊字符,并允许您在替换中使用它们。即使您的字符串中有反斜杠,quotemeta 也会处理它们。
      2. 您不必在匹配和替换中使用/ 作为分隔符。相反,您可以替换各种其他字符。

      这些都是一样的:

      $string =~ s/$regex/$replace/;
      $string =~ s#$regex#$replace#;
      $string =~ s|$regex|$replace|;
      

      您还可以使用圆括号、方括号或花括号:

      $string =~ s($regex)($replace);
      $string =~ s[$regex][$replace]; # Not really recommended because `[...]` is a common regex
      $string =~ s{$regex}{$replace};
      

      这些作为正则表达式类引号字符的优点是它们必须是平衡的,所以如果我有这个:

      my $string  = "I have (parentheses) in my string";
      my $regex   = "(parentheses}";
      my $replace = "{curly braces}";
      
      $string = s($regex)($replace);
      print "$string\n";   # Still works. This will be "I have {curly braces} in my string"
      

      即使我的字符串包含这些类型的字符,只要它们是平衡的,一切仍然有效。

      给你的:

      my $Path = 'S:\2014 March\Test Scenarios\load\2014 March';
      $nExit = quotemeta $string;  #Quotes all meta characters...
      $nExit =~ s($sMatchPattern)($sFullReplacementString); 
      

      这应该适合你。

      【讨论】:

        【解决方案3】:

        如果你想在你的替换字符串或匹配字符串中有一个\,不要忘记在你想要的反斜杠前面加上另一个反斜杠,因为它是一个运算符...

        $sFullReplacementString = "\\";
        

        这会将字符串变成单个 \

        【讨论】:

          猜你喜欢
          • 2019-05-05
          • 1970-01-01
          • 2021-01-31
          • 2018-08-21
          • 2015-02-20
          • 2017-01-05
          • 1970-01-01
          • 2011-03-19
          • 2010-11-19
          相关资源
          最近更新 更多