- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有这样一个字符串:
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 Problemii) As
.+
is greedy, it will match all the string and move to last <-- No problemiii) 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 finds10: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 match10:10
. It is obvious that end of string do not matches10: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)
For \d+.+(?!10:10)
图片来源 :- https://regex101.com/
关于regex - 为什么在回溯中不考虑消极前瞻?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36916408/
我有一个看起来像这样的字符串: text = "9) 9 的文本\r\n10) 10 的文本\r\n11) 11 的文本\r\n12) ...\r\n123) 123 的文本" 我正在尝试将其拆分如下
下一代的 3D Tiles 前瞻 原文:Introducing 3D Tiles Next, Streaming Geospatial to the Metaverse 原文发布时间:2021年11月
我有一个使用正则表达式回顾的 string.replace() 函数。 myString.replace(/(?
我是一名优秀的程序员,十分优秀!