我正在解析文本文档并替换一些文本。似乎找不到没有“\”的文本行,并且没有任何问题。
顺便说一下,这是在Perl中完成的
我有一个如下字符串:
Path=S:\2014 March\Test Scenarios\load\2014 March
包含斜杠是“问题”的问题。我正在使用简单的搜索和替换代码行
$nExit =~ s/$sMatchPattern/$sFullReplacementString/;
我该怎么做?
答案 0 :(得分:3)
我怀疑你正在尝试匹配文字字符串,因此需要转义正则表达式特殊字符。
您可以使用quotemeta
或转义码\Q ... \E
来执行此操作:
$nExit = s/\Q$sMatchPattern/$sFullReplacementString/;
将插入上述变量$sMatchPattern
,但在编译正则表达式之前,任何特殊字符都将被转义。因此,$sMatchPattern
的值将被视为文字字符串。
答案 1 :(得分:2)
此字符串是否已输入,或者是否已嵌入您的程序中。您可以这样做以摆脱反斜杠字符:
my $path = "S:/2014 March/Test Scenarios/load/2014 March";
顺便说一句,最好不要在文件和路径名中包含空格。在某些情况下,它们可能会有点问题。如果你无法消除它们,这是可以理解的。
你应该看两件事:
quotemeta
也会处理它们。/
作为分隔符。相反,您可以替换其他各种角色。 这些都是一样的:
$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 = "\\";
这会将字符串转换为单个\