例如,下面的正则表达式会导致失败报告lookbehind断言不是固定长度:
#(?<!(?:(?:src)|(?:href))=["\']?)((?:https?|ftp)://[^\s\'"<>()]+)#S
这种限制不存在于前瞻。
lookahead和lookbehind不像他们的名字暗示那么相似。如果它是一个独立的正则表达式,前瞻表达式的工作方式完全相同,只是它锚定在当前匹配位置,并且不消耗匹配的结果。
Lookbehind是一个完全不同的故事。从当前匹配位置开始,每次向后翻一个字符一个字符,尝试在每个位置匹配其表达式。在没有匹配的情况下,后面必须一直到文本的开始(一次一个字符,记住),在它放弃之前。将其与前瞻表达式进行比较,该表达式仅应用一次。
这当然是一个粗略的过度简化,并不是所有的口味都这样工作,但你得到的想法。应用后瞻的方式与应用前瞻的方式(根本不同)(并且远远不如效率更高)。只有对后瞻才有多远的限制才有意义。