Ver Mensaje Individual
  #3 (permalink)  
Antiguo 31/01/2007, 09:55
Avatar de derkenuke
derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 7 meses
Puntos: 45
Re: expresiones regulares avanzado

Bueno, rebuscando he encontrado este mensaje para el que ya encontré respuesta en su día:

Negar un carácter [^a]. Negar un conjunto de caracteres [^aeiou] (negamos vocales = consonantes).

Negative lookahead: q(?!u) --> todas las q no seguidas por una u
Positive lookahead: q(?=u) --> todas las q seguidas de una u
Incluso se puede hacer (?=(regex)), metiendo una regex entre paréntesis

Negative lookbehind: (?<!u)q --> todas las q no precedidas por una u
Positive lookbehind: (?<=u)q --> todas las q precedidas por u

Pero todas las lookbehind me dan error en sintaxis de expresion regular y es porqué javascript no las soporta


Voy a plantear unos ejemplos:
Tengo la palabra murcielago (así, sin tildes para simplificar). Quiero coger todas las consonantes seguidas de vocal:
[^aeiou][aeiou] lo conseguiría --> mu,ci,la,go
Ahora quiero coger sólo la consonante seguida de vocal, sin guardar la vocal:
[^aeiou](?=[aeiou]) --> m,c,l,g


Un apunte para buscar hacia delante. Si tenemos farola y fabola y queremos fichar todas las fa seguidas, por ejemplo, de una consonante y después una o, no podemos hacer:
fa(?=[^aeiou])o
Para entender esto hace falta saber cómo trabaja el motor de regex. Esto es porque la expresión regular empieza buscando fa, y encuentra en las dos fa. Después corrobora que está seguida de una consonante, y VE (no encuentra) una r o una b, según el caso. Seguidamente, después de fa, busca una o inexistente en nuestra cadena. Luego no encuentra en ninguno de los dos casos.

Nuestra expresión regular resulta imposible, ya que mira si despues de fa hay una consonante, y después si fa está seguida de una o, que no es consonante.

Viene a ser el equivalente de escribir if(false), que nunca se va a cumplir.

Para que funcione y encuentre fa+consonante+o tenemos que hacer algo asi:
fa(?=[^aeiou])[^aeiou]o
añadiendo después del lookahead lo que estabamos mirando, para buscarlo. La verdad es que me parece un poco estúpido, porqué viene a ser lo mismo que
fa[^aeiou]o
a secas, por lo menos eso pienso. Si alguien me lo puede verificar...


Y las condicionales if then else de las expresiones regulares tampoco son aceptadas, dan error en sintaxis.




.. y eso es todo lo que sé hasta el momento...
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.