为什么(?!^)等同于(?<!^)?

And*_*son 5 regex

不久之后,我回答了这个问题,但我仍然没有想出为什么我的答案有效.

出于某种原因,字符串开头的负前瞻行为与负面后观行为相同.

例如,在PHP中

preg_replace("/(?!^)12/", "ab", "12345");   // 12345
preg_replace("/(?<!^)12/", "ab", "12345");  // 12345
preg_replace("/(?!1)23/", "ab", "12345");   // 1ab45
preg_replace("/(?<!1)23/", "ab", "12345");  // 12345
Run Code Online (Sandbox Code Playgroud)

我知道这不是有史以来最有用的问题,但这已经让我困扰了几个星期.

Ste*_*ham 8

插入符号是零宽度断言.事实上,前瞻和后视也是零宽度.因此,在这种情况下,如果您向前或向后看并不重要,您仍然在寻找相同的角色位置.

这篇文章很好地解释了这一点.