gpt4 book ai didi

regex - 为什么在回溯中不考虑消极前瞻?

转载 作者:行者123 更新时间:2023-12-02 06:53:30 26 4
gpt4 key购买 nike

假设我有这样一个字符串:

121456 word123word456word897 10:10

我的条件是检查字符串末尾的10:10。所以我会这样写模式:

$s = "121456    word123word456word897   10:10";
if($s =~m/\d+(.+)(?=10:10)/)
{
print "$1\n"; #
print "Hello ";
}

这里.+匹配到end,然后回溯匹配10:10。并且 $1 包含 word123word456word897

但问题是,我用否定的前瞻性写条件,但正则表达式搜索引擎无法回溯。

if($s =~m/\d+(.+)(?!10:10)/)
{
print "$1\n";
print "Hello ";
}

此处 $1 包含 word123word456word897 10:10。回溯不考虑负面展望。这种消极的展望有什么问题?

最佳答案

注意:- 我将根据自己的理解对此进行解释。欢迎大家指正

为什么这里会发生这种情况?

默认情况下,正则表达式引擎的目标是满足在字符串中查找匹配项的所有必需条件。如果当前状态不满足正则表达式条件,这是通过回溯、简单匹配和跳转到不同的保存状态(通常由 NFA 引擎支持)来实现的。

一旦所有条件都满足,要求就满足了,引擎停止检查任何其他事情。进一步不需要回溯、匹配或做任何花哨的事情,因为要求已经满足。

现在回到你的问题,下面是你的字符串

121456    word123word456word897   10:10

在你的第一个正则表达式中

\d+.+(?=10:10) 

i) \d+ matches all the digits <-- No Problem

ii) As .+ is greedy, it will match all the string and move to last <-- No problem

iii) To satisfy the next condition (?=10.10), there is no string left. So all the conditions are not fulfilled and hence to meet this condition, regex engine starts backtracking till it finds 10:10

在你的第二个正则表达式中

\d+.+(?!10:10) 

i, ii) The first two steps are exact same as above

iii) To satisfy the next condition (?!10:10), whatever follows (here, we already have reached end of string or $ due to greediness of .+) should not match 10:10. It is obvious that end of string do not matches 10:10. Hence all of our condition is fulfilled. So there is no need of backtracking or doing anything at all because all our required conditions are met.

一图胜千言

For \d+.+(?=10:10)

enter image description here

For \d+.+(?!10:10)

enter image description here

图片来源 :- https://regex101.com/

关于regex - 为什么在回溯中不考虑消极前瞻?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36916408/

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