gpt4 book ai didi

regex - 为什么正则表达式引擎不回溯 .*?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:29:06 25 4
gpt4 key购买 nike

我试图理解以下正则表达式:
拥有:

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)。然后由于 . 无法匹配行尾匹配失败。那么既然 * 是可选的,那么正则表达式引擎是否应该回溯并释放 \ 并尝试再次匹配?
这似乎没有发生,因为反向引用是空的。
有人可以帮助我理解这一点吗?

最佳答案

编辑以考虑@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

这也行。

所以,实际上,问题与回溯和 .* 没有太大关系。它与您在字符串中使用反斜杠以及您期望该用法产生的结果有关。

关于regex - 为什么正则表达式引擎不回溯 .*?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21660525/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com