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

时间:2011-07-04 22:43:11

标签: regex

不久前我回答this question,但我仍然没有弄清楚为什么我的回答有效。

由于某种原因,字符串开头的负向前瞻与负面的后观行​​为相同。

例如,在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

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

1 个答案:

答案 0 :(得分:8)

插入符是零宽度断言。事实上,前瞻和后视也是零宽度。因此,在这种情况下,无论你是向前还是向后看都没关系,你仍然在寻找相同的角色位置。

this article中很好地解释了这一点。