我有一个文本文件,我想确定哪些行包含反斜杠,后跟小写字母“n”或双引号字符。以下内容对我不起作用。有人请解释原因吗?谢谢!
my $pattern='\\[n"]';
if ($text =~ /$pattern/) {
# Do stuff...
}
答案 0 :(得分:3)
在单引号内,除了嵌入的单引号或字符串末尾的反斜杠外,不需要转义任何字符。然而,对的反斜杠被认为是第一个逃避第二个反斜杠,所以
my $pattern='\\[n"]'
与
相同my $pattern='\[n"]'
我希望您现在可以看到,如果您使用/$pattern/
将其编译为正则表达式,则反斜杠现在将转义左方括号[
。
正则表达式中您想要的是/\\[n"]/
,因此您需要$pattern
字符串中的两个反斜杠。
因为每对反斜杠中的一个被作为一个转义被吃掉,你需要在原始字符串中使用四个才能让事情发挥作用,就像这样
my $pattern='\\\\[n"]'
正确生成六个字符的字符串\\[n"]
。现在,您的匹配/$pattern/
将执行您想要的操作。
答案 1 :(得分:2)
因为正则表达式将反斜杠解释为将括号转义为字符类。
它等同于该行:
if ($text =~ /\[n"]/) {
最简单的解决方案是使用qr
来定义您的模式:
my $text = "\\n";
my $pattern = qr{\\[n"]};
if ($text =~ /$pattern/) {
print "bingo";
}
输出:
bingo
答案 2 :(得分:0)
use strict;
use warnings;
my $pattern = qr!\\[n"]!;
while( my $line = <DATA>) {
if( $line =~ $pattern ) {
print $line;
}
}
__DATA__
1: yes\n
2: no \=
3: yes\"
打印:
1: yes\n
3: yes\"