我的文本文件有一些字符串,如"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";
你能帮我解决一下吗?
答案 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/;