2010-09-26 27 views
9

Tengo un problema con la aserción de búsqueda anticipada (? =). Por ejemplo, tengo la expresión:Regex: aserción de búsqueda anticipada

/Win(?=2000)/ 

Se coincide Win, si la expresión es como Win2000, Win2000fgF. Tengo siguiente expresión:

^(?=.*\d)(?=.*[a-z]).*$ 

Se han encontrado para dígitos y letras minúsculas, por ejemplo: 45dF, 4Dd. Pero no sé, por qué funciona y coincide con todos los personajes :) No tengo caracteres, que están antes de (?=.*\d). Creo que, sólo que esta expresión debe trabajar:

^.\*(?=.*\d)(?=.*[a-z]).*$ 

(con \* antes de expresión).

¿Podría explicarlo?

Respuesta

38

Digamos que somos el motor de expresiones regulares y aplicamos la expresión regular ^(?=.*\d)(?=.*[a-z]).*$ a la cadena 2a.

comienza en la posición 0 (antes de que el primer carácter):

  1. ^: Asegúrese de que estamos en el inicio de la cadena: OK
  2. (?=: Vamos a ver si la siguiente expresión regular podría igualar. ..
  3. .*: coincide con cualquier número de caracteres ->2a. DE ACUERDO.
  4. \d: No, ya estamos en el final. Retrocedamos un personaje: a -> No, no coincide. Regresa otra: 2 -> ¡PARTIDO!
  5. ): Fin de la búsqueda anticipada, coincida con éxito. ¡Estamos todavía en la posición 0!
  6. (?=: Vamos a ver si la siguiente expresión regular podría igualar ...
  7. .*: combinar con cualquier número de caracteres ->2a. DE ACUERDO.
  8. [a-z]: No, ya estamos en el final. Retrocedamos un personaje: a -> ¡COINCIDIR!
  9. ): Fin de la búsqueda anticipada, coincida con éxito. ¡Estamos todavía en la posición 0!
  10. .*: coincide con cualquier número de caracteres ->2a -> MATCH!
  11. $: Veamos - ¿estamos al final de la cadena? ¡Sí somos! -> ¡PARTIDO!
  12. Oye, hemos llegado al final de la expresión regular. Estupendo. ¡Partido completado!
+0

Gracias por una gran explicación. ¿Podría decirme por qué^(? =. * \ D) (? =. * [A-z]) $ (sin. * Al final) no funciona para 2a? Esta expresión regular debe coincidir? – luk4443

+4

Bueno, imagine que omite el paso 10: el motor de expresiones regulares todavía está en la posición 0, por lo que falla al hacer coincidir el '$'. –

+0

Ok, gracias :) – luk4443

3

lookaheads no coinciden, afirman.

esto significa que si utiliza una búsqueda anticipada, necesita algo que coincidirá con lo que desee si quiere ir más allá.

Cuestiones relacionadas