Expresiones Regulares utilizando la Sintaxis Java Regex

  • Posted on: 28 October 2014
  • By: ReYDeS

Las expresiones regulares son maneras de describir un conjunto de cadenas basados en características comunes compartidas por cada cadena en el conjunto. Estas pueden ser utilizadas para buscar, editar, o manipular texto y datos. Es útil aprender la sintaxis específica para crear expresiones regulares, esto va más allá de la sintaxis normal del lenguaje de programación Java. Las expresiones regulares varían en complejidad, pero una vez comprendido lo básico sobre su construcción, se será capaz de descifrar (o crear) cualquier expresión regular.

Los siguientes ejemplos descifran las cuatro expresiones regulares incluidas en Autopsy 3, relacionadas a Direcciones de Correo Electrónico, Número de Teléfono, Direcciones IP y URL.

Número de Teléfono

[(]{0,1}\\d\\d\\d[)]{0,1}[\\.-]\\d\\d\\d[\\.-]\\d\\d\\d\\d

El caracter entre corchetes representa el mismo caracter.
X{n, m}Representa al menos lo precedente n veces, pero no más de m veces.
\\ Representa el caracter slash.
\d Representa un dígito [0-9]

Direcciones IP

(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])

- El guión representa un rango entre corchetes.
| La tubería es el operador lógico OR.
X{n} Representa X al menos un número n de veces.
\\ Representa el caracter slash.

Antes de continuar con los dos ejemplos siguientes, mencionar un concepto sobre los Grupos y Capturas.

Número de Grupo:

La captura de grupos son numerados contando sus paréntesis de apertura de izquierda hacia derecha. En la expresión ((A)(B(C))) por ejemplo existen 4 grupos.

1 ((A)(B(C)))
2 (A)
3 (B(C))
4 (C)

El grupo cero es sinónimo de toda la expresión.

La captura de grupos es así denominada debido, durante una comparación, cada subsecuencia de la secuencia de entrada que corresponde al grupo es guardada. La subsecuencia capturada puede ser utilizada luego en la expresión, mediante una nueva referencia, y también puede ser recuperada desde el comparador una vez completada la operación de comparación.

Nombre de Grupo

A un grupo de captura también se le puede asignar un “nombre”, un grupo de captura nombrado, y luego ser posteriormente referenciado de nuevo por este “nombre”. Los nombres de grupo están constituidos de los siguientes caracteres. El primer caracter debe ser una letra.

Las letras mayúsculas 'A' a 'Z' ('\ u0041' al '\ u005a'),
Las letras minúsculas 'a' a 'z' ('\ u0061' al '\ u007a'),
Los dígitos '0' al '9' ('\ u0030' al '\ u0039'),

Un grupo de captura nombrado está numerado tal como se describe en el número de grupo.

La entrada capturada asociada con un grupo es siempre la subsecuencia del grupo comparado más recientemente. Si un grupo es evaluado una segunda vez debido a la cuantificación entonces su valor es el previamente capturado, en este caso, será retenido si una segunda evaluación falla. Compararla cadena “aba” contra la expresión (a(b)?)+ por ejemplo, deja dos grupos definidos a “b”. Toda la entrada capturada es descartada al inicio de cada comparación.

Los grupos que inician con (? son ya sea grupos puros de no captura que no capturan texto y no cuentarán para el total del grupo, o grupo de captura nombrado.

Direcciones de Correo

(?=.{8})[a-z0-9%+_-]+(?:\\.[a-z0-9%+_-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z]{2,4}(?<!\\.txt|\\.exe|\\.dll|\\.jpg|\\.xml)

?=X Representa X mediante una búsqueda hacia adelante positiva de anchura cero.
X+ Representa X uno o más veces.
?:X Representa X como un grupo de captura nombrado.
X* Representa X cero o más veces.
?<!X Representa X mediante una búsqueda hacia adelante negativa de anchura cero.

URLs

((((ht|f)tp(s?))\\://)|www\\.)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,5})(\\:[0-9]+)*(/($|[a-zA-Z0-9\\.\\,\\;\\?\\'\\\\+&amp;%\\$#\\=~_\\-]+))*

X? Representa X una vez o de ningún modo.
$ Representa el final de una línea.

Fuentes:

http://docs.oracle.com/javase/tutorial/essential/regex/intro.html
http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html
http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

Sobre el Autor


Alonso Eduardo Caballero Quezada - ReYDeS
Instructor y Consultor Independiente en Ciberseguridad
Correo Electrónico: ReYDeS@gmail.com
Twitter: https://twitter.com/Alonso_ReYDeS
LinkedIn: https://pe.linkedin.com/in/alonsocaballeroquezada/
Facebook: https://www.facebook.com/alonsoreydes
Youtube: https://www.youtube.com/c/AlonsoCaballero


Webinar Informática Forense