例如,下面的正则表达式将导致失败报告lookbehind断言不是固定长度:
#(?<!(?:(?:src)|(?:href))=["\']?)((?:https?|ftp)://[^\s\'"<>()]+)#S
前瞻不存在此类限制。
最佳答案
Lookahead 和 Lookbehind 并不像它们的名字所暗示的那么相似。前瞻表达式的工作方式与独立正则表达式完全相同,只是它锚定在当前匹配位置并且不消耗其匹配的内容。
Lookbehind 是一个完全不同的故事。从当前匹配位置开始,它一次一个字符地向后遍历文本,尝试匹配每个位置的表达式。如果无法匹配,则回溯必须一直走到文本的开头(记住,一次一个字符),然后才会放弃。将其与前瞻表达式进行比较,后者仅应用一次。
当然,这过于简单化了,并不是所有的口味都这样,但你明白了。后视的应用方式与先行的应用方式根本不同(而且效率低得多)。只有限制后视必须向后看多远才有意义。
关于regex - 正则表达式中 "lookbehind assertion MUST be fixed length"的技术原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3796436/