2011-07-04 14 views
5

Hace un tiempo respondí this question en SO, pero todavía no entiendo por qué mi respuesta funcionó.¿Por qué (?! ^) Es equivalente a (? <! ^)?

Por alguna razón, una anticipación negativa para el inicio de una cadena se comporta igual que una mirada negativa detrás.

Por ejemplo, en 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 

Yo sé que no es la cuestión más útil preguntado alguna vez, pero esto me ha sido REGAÑA durante un par de semanas.

Respuesta

8

El símbolo de intercalación es una aserción de ancho cero. De hecho, lookaheads y lookbehinds tienen un ancho cero también. Por lo tanto, en este caso, no importa si mira hacia adelante o hacia atrás, todavía está mirando la misma posición de personaje.

Esto se explica bastante bien en this article.

+0

Gracias, ese tipo de sentido, pero creo que necesito una noche de descanso para dejar que se hunda. –

Cuestiones relacionadas