Perl搜索和替换 - 问题是由“\”引起的

时间:2014-04-25 18:21:13

标签: perl search str-replace

我正在解析文本文档并替换一些文本。似乎找不到没有“\”的文本行,并且没有任何问题。

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

我有一个如下字符串:

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

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

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

我该怎么做?

3 个答案:

答案 0 :(得分:3)

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

您可以使用quotemeta或转义码\Q ... \E来执行此操作:

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

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

答案 1 :(得分:2)

此字符串是否已输入,或者是否已嵌入您的程序中。您可以这样做以摆脱反斜杠字符:

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

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

你应该看两件事:

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

    $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); 
    

    那应该适合你。

答案 2 :(得分:1)

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

$sFullReplacementString = "\\";

这会将字符串转换为单个\