如果字符串在Perl中包含`\ n`,则替换不起作用

时间:2014-04-07 11:37:44

标签: regex perl

我的文本文件有一些字符串,如"string\n"(包括引号)。我需要将这些字符串放入<tags>,因此应该<tag>"string\n"</tag>。但由于\n,替代函数不起作用。

$str之后打印s///时,它仍然包含some "string\n" + 25

 my $pattern = '"string\n"';

 my $str = 'some "string\n" + 25';

 $str =~ s/$pattern/25/;

 print "$str\n";
 print "$pattern\n";

你能帮我解决一下吗?

5 个答案:

答案 0 :(得分:2)

正则表达式模式\n与换行符匹配,但您在尝试修补的字符串中没有任何换行符。如果您想匹配\后跟n,则需要使用模式\\n

要创建包含\\n的字符串,您需要使用

 '...\\\\n...'

 qr/...\\n.../

答案 1 :(得分:2)

替换运算符s/pattern/substitution/将其第一个参数解释为模式 - 像(, ), [, ], +, *, .等字符在这里都有特殊含义。此外,还解释了\A\n等反斜杠序列。你实际上在做s/"string\n"/25/,显然与换行符匹配。

要关闭特殊字符的解释,请使用\Q…\E命令:s/\Q$string1[0]\E/25/将起作用。在替换字符串时总是这样做,而不是正则表达式。

答案 2 :(得分:0)

这就是你在看我的事情

$ st = ~sw&#34;)。* /&lt; tag&gt; $ 1&lt; / tag&gt; /;

答案 3 :(得分:0)

让我看看我的想法是否正确:

您有一个可能包含以下行的文件:

I would like to use "foo/n" as my tag.

并且你希望能够提取“foo / n”并将其设置为:

<tag>"foo/n"</tag>

让我们试试这个例子:

#! /usr/bin/env perl
#

use strict;
use warnings;
use feature qw(say);

my $pattern = qr("\w+\\n");
my $string = q(I would like to be able to use "foo\n" as my tag);

say qq(Pattern = <$pattern>);
say qq(String = <$string>);
say "SUBSTITUTION";

$string =~ s/.*($pattern).*/<tag>$1<\/tag>/;

say qq(String = |$string|);

打印出来:

Pattern = <(?^:"\w+\\n")>
String = <I would like to be able to use "foo\n" as my tag>
SUBSTITUTION
String = |<tag>"foo\n"</tag>|

我在输出中使用<...>|...|作为引号。它们不是实际结果的一部分。

我使用qr构建我的正则表达式,稍后我可以在替换命令中使用它。我不得不加倍\来引用NL角色,但除此之外,它似乎有效。

答案 4 :(得分:0)

要包含文字字符串(不包含特殊正则表达式字符的字符串),您需要使用quotemeta\Q以便转义特殊字符。

 my $pattern = '"string\n"';
 my $str = 'some "string\n" + 25';

 $str =~ s/\Q$pattern\E/25/;

 print "$str\n";
 print "$pattern\n";

输出:

some 25 + 25
"string\n"

注意,\E表示特殊转义的结束,但在上面的表达式中会假设它,因为它位于LHS的末尾。

总是可以在正则表达式中包含模式并自行转义:

$str =~ s/"string\\n"/25/;