2011-07-04 62 views
5

有一段時間我回答了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 

我知道這是不是問過的最有用的問題,但是這已經我困擾了幾個星期。

回答

8

插入符是一個零寬度斷言。事實上,前視和後視也是零寬度。因此,在這種情況下,無論你是向前還是向後看都沒關係,你仍然在看同一個角色的位置。

這在this article中有很好的解釋。

+0

謝謝,這種說法很有道理,但我想我需要休息一晚讓它沉入水中。 –

相關問題