1

我正在尝试理解以下正则表达式:
具有:

SRC=array.c builtin.c eval.c field.c gawkmisc.c io.c main.c \  
            missing.c msg.c node.c re.c version.c

作为多行文本,以下正则表达式无法匹配:

~$ perl -e '  
my $var = "SRC=array.c builtin.c eval.c field.c gawkmisc.c io.c main.c \  
missing.c msg.c node.c re.c version.c";  
$var =~ /^\w+=(.*(\\\n.*))/;  
print "$1\n";  

但我不确定为什么。
我的意思是.*将匹配到行尾(\n)。然后由于.无法匹配行尾,匹配失败。那么既然*是可选的,那么正则表达式引擎不应该回溯并释放\并再次尝试匹配吗?
这似乎不会发生,因为反向引用是空的。
有人可以帮我理解这一点吗?

4

2 回答 2

5

编辑以考虑@amon 的评论(顺便说一句,谢谢)

你的任务说明...

my $var = "SRC=array.c builtin.c eval.c field.c gawkmisc.c io.c main.c \  
missing.c msg.c node.c re.c version.c";

... 包含一个反斜杠,后跟一个换行符。反斜杠在包含在双引号中的字符串中使用时,用于转义紧随其后的字符。如果你$var在这个赋值之后立即打印,你会发现你的字符串中确实没有反斜杠。

您有两个选项可以让您的正则表达式执行您希望它执行的操作。

选项 1 - 保留双引号赋值,但从正则表达式中删除反斜杠。

perl -e 'my $var = "SRC=array.c builtin.c eval.c field.c gawkmisc.c io.c main.c \  
missing.c msg.c node.c re.c version.c";  
$var =~ /^\w+=(.*(\n.*))/;  
print "$1\n";'

这行得通。

选项 2 - 将您的赋值语句放在单引号中,明确表示您想要一个反斜杠$var

# myfile.pl
my $var = 'SRC=array.c builtin.c eval.c field.c gawkmisc.c io.c main.c \  
missing.c msg.c node.c re.c version.c';  
$var =~ /^\w+=(.*(\\\n.*))/;  
print "$1\n";

因为我们的代码中有单引号,所以不在perl -e.

> perl myfile.pl

这也有效。

所以,真的,问题与回溯和.*. 它与您在字符串中使用反斜杠以及您期望该用法具有的结果有关。

于 2014-02-09T16:20:01.803 回答
0

随着(\\\n.*)您的要求是反斜杠,后跟换行符,后跟零个或多个任何字符。

字符串中没有反斜杠,因此您的模式无法匹配。

于 2014-02-09T14:52:53.753 回答