- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 answer to a recent question ,我设计了几个聪明的小正则表达式(应提问者的要求)来匹配字符串开头或结尾的子字符串。然而,当在 Regex101 上运行时,我注意到不同的模式有不同的步数(表明正则表达式引擎必须为一个和另一个做更多的工作)。然而,在我看来,没有直观的理由认为应该如此。
三种模式如下:
/(^)?!next(?(1)|$)/
( demo - 86 步) ^!next|!next$
( demo - 58 步) !next(?:(?<=^.{5})|(?=$))
( demo - 35 步) 最佳答案
TL; 博士
Why is the first pattern so much less efficient than the second, and, most confusingly, why is the third so efficient?
/^x/gm
,如果主题字符串是
abc
,您认为引擎将采取多少步骤来返回“不匹配” ?你是对的,两个。
x
x
字符串断言开始后立即出现。
PCRE
启动优化
PCRE
善待其用户,提供了一些功能来加速称为启动优化的事情。它根据使用的正则表达式进行一些相关的优化。
/x/
我们的主题字符串是
abc
然后启用启动优化后,将进行预扫描以查找
x
,如果没有找到整个匹配失败或更好它甚至不费心去经历匹配过程。
/^x/gm
/^x/g
m
未设置的标志。对于那些不知道什么的人
m
如果设置了标志,则执行以下操作:
^
的含义和
$
从某种意义上说,它们不再表示字符串的开始和结束,而是表示行的开始和结束。
/^x/g
在我们的主题字符串
abc
?我们是否应该期望引擎采取的步骤有所不同?绝对没错。我们来看
regex101.com返回信息:
m
修饰符设置,预扫描看起来断言字符串的开始(一个已知的起点)。如果断言通过,则实际匹配函数运行,否则“不匹配”将返回。
/^x/g
它立即断言字符串的开始,然后像这样失败(因为它在
^
匹配,它经历了实际的匹配过程)。这就是为什么我们看到
regex101.com显示步数为
2 .
m
修饰符的东西不同。现在两者的含义
^
和
$
anchor 被改变。与
^
匹配行首,主题字符串中相同位置的断言
abc
发生但下一个直接字符不是
x
,在实际匹配过程中,因为
g
标志打开,下一场比赛从
b
之前的位置开始并且失败了,这个反复试验一直持续到主题字符串的结尾。
(*NO_START_OPT)
所以只有当这个动词被设置时,6 个步骤才是正确的。我说我不确定后者,因为
所有 anchor 定模式都会阻止进一步的预扫描优化 我们应该知道什么可以称为
anchored pattern :
A pattern is automatically anchored by PCRE if all of its top-level alternatives begin with one of the following:
^
unlessPCRE_MULTILINE
is set\A
always\G
always.*
ifPCRE_DOTALL
is set and there are no back references to the subpattern in which.*
appears
m
时不进行预扫描时的内容。标志是
不是 设置在
/^x/g
:它被认为是禁用预扫描优化的 anchor 定模式。所以当
m
标志已打开,这不再是 anchor 定模式:
/^x/gm
因此可以进行预扫描优化。
\A
(或
^
多行模式禁用时)仅在匹配时出现一次,因此不会在下一个位置继续。
^
与
m
标志一起),第三个不是。也就是说,第三个正则表达式受益于预扫描优化。您可以相信
35 步骤,因为优化导致它。但是如果禁用启动优化:
(*NO_START_OPT)!next(?:(?<=^.{5})|(?=$))
关于regex - 为什么这三个正则表达式的步数不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39929134/
我不确定如何根据输入大小 N 确定运行时间,尤其是当它进入具有某些限制的循环时。这就是我尝试过的。我猜常数是正确的。它看起来如何? i = 1;
我想检索 1 小时前的步数。我不需要做任何特别的事情,我只需要知道用户自上一小时以来完成了多少步。 即使我的 iPhone 记录了一些步数,检索步数的查询返回“nil”。 这是代码: let c
我正在为 Android Wear 开发一款面部 watch 。我想读取 watch 计算的步数(显示在卡上的步数)。是否有任何简单的方法来访问数据?我的研究表明我可以创建自己的步数计数器(由于准确性
我是一名优秀的程序员,十分优秀!