2011-07-04 16 views
5

Jakiś czas temu odpowiedziałem na pytanie this question, ale nadal nie wiem, dlaczego moja odpowiedź zadziałała.Dlaczego (?! ^) Jest równoważne (? <! ^)?

Z jakiegoś powodu, ujemny przodek wyprzedzający dla początku ciągu zachowuje się tak samo, jak negatywny lookbehind.

Na przykład w 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 

wiem, że nie jest to najbardziej użyteczne pytanie kiedykolwiek zapytał, ale zostało to dręczące mnie przez kilka tygodni.

Odpowiedz

8

Daszek jest asercją o zerowej szerokości. W rzeczywistości przodkowie wyprzedzający i osoby patrzące na wygląd również mają zerową szerokość. Dlatego w tym przypadku nie ma znaczenia, czy patrzysz z przodu, czy z tyłu, wciąż patrzysz na tę samą pozycję postaci.

Zostało to wyjaśnione całkiem dobrze w this article.

+0

Dzięki, taki rodzaj ma sens, ale myślę, że potrzebuję nocnego odpoczynku, żeby pozwolić mu się zanurzyć. –