regex - 正则表达式中 "lookbehind assertion MUST be fixed length"的技术原因是什么?

标签 regex pcre lookbehind

例如,下面的正则表达式将导致失败报告lookbehind断言不是固定长度:

#(?<!(?:(?:src)|(?:href))=["\']?)((?:https?|ftp)://[^\s\'"<>()]+)#S

前瞻不存在此类限制。

最佳答案

Lookahead 和 Lookbehind 并不像它们的名字所暗示的那么相似。前瞻表达式的工作方式与独立正则表达式完全相同,只是它锚定在当前匹配位置并且不消耗其匹配的内容。

Lookbehind 是一个完全不同的故事。从当前匹配位置开始,它一次一个字符地向后遍历文本,尝试匹配每个位置的表达式。如果无法匹配,则回溯必须一直走到文本的开头(记住,一次一个字符),然后才会放弃。将其与前瞻表达式进行比较,后者仅应用一次。

当然,这过于简单化了,并不是所有的口味都这样,但你明白了。后视的应用方式与先行的应用方式根本不同(而且效率低得多)。只有限制后视必须向后看多远才有意义。

关于regex - 正则表达式中 "lookbehind assertion MUST be fixed length"的技术原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3796436/

相关文章:

php - 用不间断空格替换多个空格

php - "vertical"正则表达式匹配 ASCII "image"

java - 多次匹配后视/前视

php - 如何在正则表达式后面实现可变宽度查找来获取项目列表?

javascript - 如何创建子字符串,替换子字符串?

php - 编写表达式以递归地提取括号之间的数据

php - 正则表达式查找 2 个字符串之间的字符串,这些字符串位于 2 个子字符串不能包含单词的字符串之间

php - 正则表达式匹配除 2 个连续大括号以外的任何内容

python正则表达式: how to remove all punctuation characters from a string but keep those between numbers?

java - 替换替换