Ola, somos Arume

Desenvolvemos páxinas web, aplicacións para móbiles, capas de realidade aumentada e aplicacións para Facebook. Apaixónanos a informática e somos uns perfeccionistas incurables; por eso nos nosos proxectos utilizamos estándares.

tel. 625 519 694

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

Autenticarse

Rexistrarse. Esqueceches o teu contrasinal?

Etiquetas

Saltar as etiquetas

Subscríbete ás RSS

Estás en:

  • Inicio >
  • Blog >
  • Expresións regulares: conceptos avanzados

Expresións regulares: conceptos avanzados

21 Mar 2011 por Santi

Comentarios: 1

Expresións regulares

Na nosa entrada "Expresións regulares: conceptos básicos" comezamos a tratar os conceptos básicos para traballar con expresións regulares. Como o artigo estáballenos quedando un pouco máis extenso do esperado, preferimos dividir o tema en dous capítulos para mellorar a súa organización e facilitar a comprensión. Desta forma continuaremos nesta entrada falando sobre expresións regulares, comentando agora certos temas máis avanzados que se nos quedaron no tinteiro, como o concepto de voracidade, asercións e diversas secuencias de escape de gran utilidade.

Voracidade

Un concepto moi importante que debemos ter en conta á hora de usar os cuantificadores é que por defecto todos son voraces ("greedy"). Que significa isto? Pois simplemente que os cuantificadores intentarán "acaparar" o maior número de carácteres posibles. Por exemplo, que resultado obteremos se buscamos a expresión regular /p.+a/i dentro da cadea "Pasadena"? "Pasa" ou "Pasadena"? Pois agora que sabemos que por defecto o cuantificador "+" é voraz e intentará buscar o maior número de carácteres posibles, a resposta é "Pasadena".

Se queremos usar un cuantificador de forma non voraz ("ungreedy") simplemente deberemos indicalo engadindo o carácter "?" ó final do cuantificador, desta forma o cuantificador opcional "?" non voraz escribiríase "??", os cuantifiadores de repetición "+" e "*" non voraces convértense en "+?" e "*?" respectivamente e as chaves de repetición escribiríanse na súa versión non voraz como "{2}?". No noso exemplo anterior, se buscamos a expresión regular /p.+?a/i en "Pasadena", agora obteremos como resultado "Pasa".

Existe un modificador que nos permite inverter a voracidade dos cuantificadores: "U" (maiúscula, non confundir co modificador "u" minúscula que indica que o texto está codificado en UTF-8). Desta forma, por defecto os cuantificadores da expresión serán non voraces, a non ser que lles engadamos un "?", que os converte en voraces.

Secuencias de escape

Posto que determinados carácteres non teñen unha representación gráfica directa (por exemplo, o carácter "tabulador"), existe unha forma para especificar certos carácteres usando o metacarácter de escape "\":

  • \t Tabulador (código hexadecimal 09)
  • \n Nova liña (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 exemplo \x1b é o carácter Escape)
  • \0dd Carácter con código octal "dd" (por exemplo \033 é o carácter Escape)
  • \N{U+hh} Carácter con código Unicode "hh" (por exemplo \N{U+263a} é o carácter Unicode SMILEY)

Clases de carácteres

Ademais de carácteres concretos, as secuencias de escape poden ser utilizadas para designar certas clases de carácteres de uso común:

  • \w Representa un carácter "de palabra" (alfanumérico máis "_")
  • \W Representa calquera carácter que non sexa "de palabra" (non alfanumérico nin "_")
  • \s Representa un carácter de espazo en branco (tabulador, espazo, ...)
  • \S Representa calquera carácter que non sexa un espazo en branco
  • \d Representa un carácter de díxito (0-9)
  • \D Representa calquera carácter que non sexa un díxito

Na documentación oficial podemos atopar unha lista exhaustiva das listas de secuencias de escape.

Asercións

As asercións son tests que nos permiten indicar caracteres que deben existir antes ou logo da posición da aserción, pero que non se inclúen na cadea buscada (conceptualmente considérase que son de "lonxitude cero" porque "non consomen carácteres" á hora de substituír a expresión regular). Quizais non sexamos conscientes, pero xa vimos dous tipos de asercións: os metacaracteres "^" e "$" (principio e final de cadea), posto que nos permiten indicar que a cadea buscada está ao principio ou ao final.

Mediante secuencias de escape podemos definir as seguintes asercións "simples":

  • \b Límite de palabra (se indica o principio dunha palabra: debe existir un carácter \W antes e un carácter \w logo da aserción; para fin de palabra debe darse a mesma condición, pero á inversa)
  • \B Posición que non é límite de palabra. Inverso á aserción \b (os carácteres inmediatamente anterior e posterior á aserción deben de ser ambos \w ou ambos \W)
  • \A Principio de cadea (sempre, non depende do modo multiliña como a aserción "^")
  • \z Final de cadea (sempre, non depende do modo multiliña como a aserción "$")
  • \Z Final de cadea ou nova liña ó final da cadea. É idéntico á aserción anterior \z, pero permite que a cadea estea terminada cun carácter "nova liña".

Adicionalmente, pódense definir asercións máis complexas mediante as asercións "mirar ó redor" ("look-around"), que se indican encerradas entre paréntese e co carácter "?" como primeiro membro, da forma "(? )". Existen dous tipos:

  • As asercións "mirar despois" ("lookahead") permítennos indicar que certos carácteres deben existir logo da posición da aserción. Indícanse mediante os carácteres "(?= )" para as asercións positivas ("deben existir estos carácteres") e con "(?! )" para as asercións negativas ("non deben existir estos carácteres"). Así, se por exemplo quixésemos buscar unha palabra seguida por un punto e coma, usariamos a expresión regular /\w+(?=;)/i (a búsqueda devolveríanos a palabra sen o ";").
  • Da mesma forma, as asercións "mirar antes" ("lookbehind") permítennos indicar que carácteres deben existir antes da posición da aserción. Indícanse mediante os carácteres "(?<= )" para as asercións positivas e con "(?<! )" para as asercións negativas. Desta forma, a expresión /(?<!bus|camion)eiro/ devólvenos todas as subcadeas "eiro" que non formen parte de la palabra "buseiro", nin "camioneiro". Unha restrición que debemos ter en conta con estas asercións é que o contido da aserción debe ter unha lonxitude fixa (poderemos usar alternativas de distinta lonxitude, como no noso exemplo anterior, pero non poderemos usar cuantificadores: "(?<=pal?)" é inválido, pero podemos substituílo facilmente por unha alternativa válida "(?<=pa|pal)".

Comentarios

1 comentarios. Comentar.

1. Anónimo o 28 Feb 2015 ás 12:22:32

Me fue de ayuda gracias.

Comentar

Comentar de forma anónima

Podes comentar poñendo calquera nome ou alcume, exceptuando os nomes de usuarios rexistrados. Máximo de 50 caracteres.

Comentar como usuario rexistrado

Rexistrarse. Esqueceches o teu contrasinal?