Hola, somos Arume

Desarrollamos páginas web, aplicaciones para móviles, capas de realidad aumentada y aplicaciones para Facebook. Nos apasiona la informática y somos unos perfeccionistas incurables; por eso en nuestros proyectos utilizamos estándares.

tel. 625 519 694

Mendaña de Neyra, 34, 3º B, 15008, A Coruña

Autenticarse

Registrarse. ¿Has olvidado tu contraseña?

Etiquetas

Saltar las etiquetas

Suscríbete a las RSS

Estás en:

  • Inicio >
  • Blog >
  • Expresiones regulares: conceptos avanzados

Expresiones regulares: conceptos avanzados

21 Mar 2011 por Santi

Comentarios: 1

Expresiones regulares

En nuestra entrada "Expresiones regulares: conceptos básicos" comenzamos a tratar los conceptos básicos para trabajar con expresiones regulares. Como el artículo se nos estaba quedando un poco más extenso de lo esperado, hemos preferido dividir el tema en dos capítulos para mejorar su organización y facilitar la comprensión. De esta forma continuaremos en esta entrada hablando sobre expresiones regulares, comentando ahora ciertos temas más avanzados que se nos quedaron en el tintero, como el concepto de voracidad, aserciones y diversas secuencias de escape de gran utilidad.

Voracidad

Un concepto muy importante que debemos tener en cuenta a la hora de usar los cuantificadores es que por defecto todos son voraces ("greedy"). ¿Qué significa esto? Pues simplemente que los cuantificadores intentarán "acaparar" el mayor número de caracteres posibles. Por ejemplo, ¿qué resultado obtendremos si buscamos la expresión regular /p.+a/i dentro de la cadena "Pasadena"? ¿"Pasa" o "Pasadena"? Pues ahora que sabemos que por defecto el cuantificador "+" es voraz e intentará buscar el mayor número de caracteres posibles, la respuesta es "Pasadena".

Si queremos usar un cuantificador de forma no voraz ("ungreedy") simplemente deberemos indicarlo añadiendo el carácter "?" al final del cuantificador, de esta forma el cuantificador opcional "?" no voraz se escribiría "??", los cuantifiadores de repetición "+" y "*" no voraces se convierten en "+?" y "*?" respectivamente y las llaves de repetición se escribirían en su versión no voraz como "{2}?". En nuestro ejemplo anterior, si buscamos la expresión regular /p.+?a/i en "Pasadena", ahora obtendremos como resultado "Pasa".

Existe un modificador que nos permite invertir la voracidad de los cuantificadores: "U" (mayúscula, no confundir con el modificador "u" minúscula que indica que el texto está codificado en UTF-8). De esta forma, por defecto los cuantificadores de la expresión serán no voraces, a no ser que les añadamos un "?", que los convierte en voraces.

Secuencias de escape

Puesto que determinados caracteres no tienen una representación gráfica directa (por ejemplo, el carácter "tabulador"), existe una forma para especificar ciertos caracteres usando el metacarácter de escape "\":

  • \t Tabulador (código hexadecimal 09)
  • \n Nueva línea (código hexadecimal 0A)
  • \r Retorno de carro (código hexadecimal 0D)
  • \e Escape (código hexadecimal 1B)
  • \xhh Carácter con código hexadecimal "hh" (por ejemplo \x1b es el carácter Escape)
  • \0dd Carácter con código octal "dd" (por ejemplo \033 es el carácter Escape)
  • \N{U+hh} Carácter con código Unicode "hh" (por ejemplo \N{U+263a} es el carácter Unicode SMILEY)

Clases de caracteres

Además de caracteres concretos, las secuencias de escape pueden ser utilizadas para designar ciertas clases de caracteres de uso común:

  • \w Representa un carácter "de palabra" (alfanumérico más "_")
  • \W Representa cualquier carácter que no sea "de palabra" (no alfanumérico ni "_")
  • \s Representa un carácter de espacio en blanco (tabulador, espacio, ...)
  • \S Representa cualquier carácter que no sea un espacio en blanco
  • \d Representa un carácter de dígito (0-9)
  • \D Representa cualquier carácter que no sea un dígito

En la documentación oficial podemos encontrar una lista exhaustiva de las listas de secuencias de escape.

Aserciones

Las aserciones son tests que nos permiten indicar caracteres que deben existir antes o después de la posición de la aserción, pero que no se incluyen en la cadena buscada (conceptualmente se considera que son de "longitud cero" porque "no consumen caracteres" a la hora de sustituir la expresión regular). Quizás no seamos conscientes, pero ya hemos visto dos tipos de aserciones: los metacaracteres "^" y "$" (principio y final de cadena), puesto que nos permiten indicar que la cadena buscada está al principio o al final.

Mediante secuencias de escape podemos definir las siguientes aserciones "simples":

  • \b Límite de palabra (si indica el principio de una palabra: debe existir un carácter \W antes y un carácter \w después de la aserción; para fin de palabra debe darse la misma condición, pero a la inversa)
  • \B Posición que no es límite de palabra. Inverso a la aserción \b (los caracteres inmediatamente anterior y posterior a la aserción deben de ser ambos \w o ambos \W)
  • \A Principio de cadena (siempre, no depende del modo multilínea como la aserción "^")
  • \z Final de cadena (siempre, no depende del modo multilínea como la aserción "$")
  • \Z Final de cadena o nueva línea al final de la cadena. Es idéntico a la aserción anterior \z, pero permite que la cadena esté terminada con un carácter "nueva línea".

Adicionalmente, se pueden definir aserciones más complejas mediante las aserciones "mirar alrededor" ("look-around"), que se indican encerradas entre paréntesis y con el carácter "?" como primer miembro, de la forma "(? )". Existen dos tipos:

  • Las aserciones "mirar después" ("lookahead") nos permiten indicar que ciertos caracteres deben existir después de la posición de la aserción. Se indican mediante los caracteres "(?= )" para las aserciones positivas ("deben existir estos caracteres") y con "(?! )" para las aserciones negativas ("no deben existir estos caracteres"). Así, si por ejemplo quisiéramos buscar una palabra seguida por un punto y coma, usaríamos la expresión regular /\w+(?=;)/i (la búsqueda nos devolvería la palabra sin el ";").
  • De la misma forma, las aserciones "mirar antes" ("lookbehind") nos permiten indicar qué caracteres deben existir antes de la posición de la aserción. Se indican mediante los caracteres "(?<= )" para las aserciones positivas y con "(?<! )" para las aserciones negativas. De esta forma, la expresión /(?<!bus|camion)ero/ nos devuelve todas las subcadenas "ero" que no formen parte de la palabra "busero", ni "camionero". Una restricción que debemos tener en cuenta con estas aserciones es que el contenido de la aserción debe tener una longitud fija (podremos usar alternativas de distinta longitud, como en nuestro ejemplo anterior, pero no podremos usar cuantificadores: "(?<=pal?)" es inválido, pero podemos sustituirlo fácilmente por una alternativa válida "(?<=pa|pal)".

Comentarios

1 comentarios. Comentar.

1. Anónimo el 28 Feb 2015 a las 12:22:32

Me fue de ayuda gracias.

Comentar

Comentar de forma anónima

Puedes comentar poniendo cualquier nombre o apodo, exceptuando los nombres de usuarios registrados. Máximo de 50 caracteres.

Comentar como usuario registrado

Registrarse. ¿Has olvidado tu contraseña?