Expresiones Regulares (REGEXP)

A partir de la versión 10g, con la introducción de las llamadas funciones REGEXP (REGular EXPressions), Oracle nos ofrece una batería de sofisticadas y potentes herramientas nativas que permiten al desarrollador centralizar el procesamiento intensivo de cadenas de caracteres dentro de la base de datos Oracle y con los lenguajes SQL y PL/SQL.

¿Qué son las Expresiones Regulares?

Sin embargo, un buen manejo de las expresiones regulares es algo tan poderoso que vale la pena que nos tomemos un tiempo para aprender a utilizarlas. Además, saber manejar expresiones regulares nos servirá no solamente en el mundo de las bases de datos Oracle; las podremos usar también en otros lenguajes de programación como Perl, Java, .Net, Php y Unix Shell Scripting, entre otros.

Una expresión regular como una cadena de caracteres que definen un patrón de búsqueda. En una expresión regular encontramos literales y metacaracteres. Los literales se leen al pie de la letra. Los metacaracteres son caracteres que tienen un significado especial.

Tomemos por ejemplo la siguiente expresión regular:

[p|m]apa

Los metacaracteres son los corchetes y el símbolo pipe (|). El resto son literales.

Los corchetes agrupan a varios caracteres en un solo carácter.

El símbolo pipe indica un símbolo u otro; es decir la ‘p’ o la ‘m’.

Luego, la expresión regular:

[p|m]apa

Coincide con las cadenas:

papa
mapa

¿Para qué sirven las Expresiones Regulares?

En una base de datos Oracle existen diversos escenarios en que la implementación de expresiones regulares constituye una herramienta de gran utilidad:

  • Búsqueda de texto. Las expresiones regulares nos permiten hacer búsquedas complejas de cadenas de caracteres dentro de las columnas de nuestras tablas.
  • Formateo de datos. Podemos modificar los datos proyectados en las sentencias SELECT, invirtiendo palabras, agregando o quitando caracteres, etc.
  • Definición de constraints. A fin de forzar el contenido de una columna para que se ajuste a un formato determinado: casilla de correo, número telefónico, etc.
  • Manipulación de datos. Por ejemplo, regularizando datos en procesos de migración desde aplicaciones legacy y aplicando reglas de búsqueda y reemplazo (Search & Replace).
# Operador Descripción
1 () Considera a toda la expresión entre paréntesis como una unidad. La expresión puede ser una simple cadena de literales o una expresión compleja conteniendo otros metacaracteres.
2 […] Debe coincidir cada carácter de la lista entre corchetes. Ej. ma[pms]a encuentra (mapa, masa, mama) y no encuentra (mata)
3 [^…] No debe coincidir ningún caracter de la lista entre corchete. Ej. ma[^pms]a (mata, mala) y no encuentra (mapa)
4 […..] POSIX collation element.
5 [:…:] POSIX character class. Ver las dos siguientes tablas.
6 [=…=] POSIX character equivalence class. Ej. [=e=] representa e, é, è, ë, …
7 . El metacaracter punto coincide con cualquier carácter. Ej. ma.a (mapa,masa,mata,…)
8 ? Coincide con cero o una  ocurrencia de la subexpresión que le precede al asterisco. Ej. map?a (mapa, maa)
9 * Coincide con cero o más ocurrencias de la subexpresión que le precede al asterisco. Ej. map*a (mapa, mappa, mappppa, maa)
10 + El metacaracter suma coincide con una o más ocurrencias de la subexpresión que lo precede. Ej. ma+a (mapa, mapppa, mappppppa)
11 {n1} Empareja exactamente n1 ocurrencias de la subexpresión precedente. Ej. a{5} (aaaaa)
12 {n1,} Empareja al menos n1 ocurrencias de la subexpresión precedente. Ej. a{5,} (aaaaa, aaaaaa, aaaaaaa, …)
13 {n1,n2} Empareja entre n1 y n2 ocurrencias de la subexpresión precedente. Ej. a{3,5} (aaa, aaaa, aaaaa)
14 Precediendo a un metacaracter con el símbolo de escape, el metacaracter será interpretado como un literal. El doble carácter de escape (\) permite considerar al carácter de escape como literal. Ej. *hola* (*hola*) Ej. \hola (hola)
15 n Debe coincidir la n-ésima subexpresión que le precede.
16 | Logical OR. Ej. [v|b]aca (vaca, baca)
17 ^ Coincide con el principio de línea y el operador está representado con el carácter sombrerito (^). Ej. ^hola (hola, holamundo, …)
18 $ Coincide con el final de línea y el operador está representado con el carácter pesos ($). Ej. hola$ (hola, mundohola, …)

El item 5 son entradas para character classes, los cuales son independientes del character set y su descripción será mostrada en la tabla siguiente .

Character Class All Characters of type
[:alnum:] Representa un carácter alfanumérico. Incluye letras y números. Omite símbolos de puntuación.
[:alpha:] Incluye letras solamente.
[:blank:] Espacio en blanco.
[:cntrl:] Carácter de control.
[:digit:] Carácter Numérico.
[:graph:] Toda la combinación de character class [:punct:] , [:upper:], [:lower:], [:digit:]
[:lower:] Representa un carácter en minúscula.
[:print:] Representa un carácter que se puede imprimir.
[:punct:] Punctuation characters.
[:space:] Representa un espacio.
[:upper:] Representa un carácter en mayúscula.
[:xdigit:] Valid hexadecimal characters.

La siguiente tabla muestra Character Ranges.

Range All Characters of Type
[A-Z] All upercase alphabetic characters.
[a-z] All lowercase characters.
[0-9] All numeric digits.
[1-9] All numeric digits excluding zero.

Regular Expression Function

Para poder hacer uso de todo lo visto hasta ahora Oracle SQL incluye un grupo de nuevas  funciones y condiciones para poder manejar expresiones regulares a partir de la versión 10g :

Regular Expression Funciton Parámetros Descripción
REGEXP_SUBSTR (s1, pattern, p1, n1, m1)s1 – cadena de caracteresPattern – expresión regularp1 – numérico opcional (default 1)n1 – numérico opcional (default 1)m1 – 1 o más parámetros (ver tabla siguiente). Opcional Función para extraer de una cadena una subcadena de caracteres que coincidan con un patrón especificado en una expresión regular.
REGEXP_INSTR (s1, pattern, p1, n1, opt1, m1)s1 – cadena de caracteresPattern – expresión regularp1 – numérico opcional (default 1)n1 – numérico opcional (default 1)opt1 – numérico (0 o 1). Opcional (Default 0)m1 – 1 o más parámetros (ver tabla siguiente). Opcional Función que permite determinar la posición de inicio de un patrón específico en una cadena de caracteres.
REGEXP_REPLACE (s1, pattern, rep1, p1, o1, m1)s1 – cadena de caracteresPattern – expresión regularRep1 – cadena, opcional.(Default NULL)p1 – numérico opcional (default 1)o1 – numérico opcional (default 0)m1 – 1 o más parámetros (ver tabla siguiente). Opcional Función que permite hacer búsqueda y reemplazo en una cadena de caracteres utilizando expresiones regulares para la búsqueda.

La siguiente tabla muestra los valores posibles del parámetro m1 en las anteriores funciones:

Parameter Value Descripción
‘c’ utiliza una correspondencia sensible a mayúsculas/minúsculas (por defecto)
‘i’ utiliza una correspondencia no sensible a mayúsculas/minúsculas
‘n’ permite el operador de correspondencia con cualquier carácter
‘m’ trata la cadena de origen como varias líneas
‘x’ Ignora caracteres espacios en blanco

Junto con las regular expression functions tenemos una regular expression condition:

Regular Expression Condition Parámetros Descripción
REGEXP_LIKE (s1, pattern, m1)s1 – cadena de caracteresPattern – expresión regularm1 – 1 o más parámetros (ver tabla anterior). Opcional Condición que se puede utilizar en la cláusula WHERE de una sentencia SQL SELECT y que permite retornar aquellas filas que coinciden con el patrón especificado en una expresión regular.

Vamos a ver algunos ejemplos (pulsa sobre la imagen para verlo mejor):

reg_exp1

reg_exp2

Expresiones Regulares y CHECK Constraints

Se pueden utilizar expresiones regulares para filtrar los datos que se permiten entrar en un tabla mediante restricciones. El siguiente ejemplo muestra cómo podría ser configurado una columna para permitir sólo caracteres alfabéticos dentro de una columna VARCHAR2. Esto le denegará signos de puntuación, dígitos, elementos de separación, …

CREATE TABLE t1 (
c1 VARCHAR2(20), CHECK
(REGEXP_LIKE(c1, ‘^[[:alpha:]]+$’)));

INSERT INTO t1 VALUES (‘newuser’);
-> 1 row created.
INSERT INTO t1 VALUES (‘newuser1’);
-> ORA-02290: check constraint violated

4 Comments

  • Antonio

    07/06/2013

    Hola.
    Me ha gustado mucho tu artículo.
    Quería hacerte una pregunta, aunque no sé si se ajusta exactamente a la expresiones regulares.
    Tengo una duda sobre cadenas varchar2 y la comparación > con otra cadena.
    El ejemplo sería SELECT….WHERE… AND FECHA >= ‘20120706000000’.
    Me podrías decir si me daría los números mayores o a que nivel realizaría la comparación.
    Saludos.

    Reply
    • moikmeg

      07/06/2013

      Hola Antonio,

      Oracle compara dos valores carácter a carácter hasta el primer carácter que se diferencia. El valor con el mayor carácter en esa posición se considera mayor. Oracle utiliza la semántica de comparación nonpadded cuando uno o ambos valores en la comparación tienen el tipo de datos VARCHAR2 o NVARCHAR2.

      Oracle compara los caracteres individuales de acuerdo a sus valores numéricos en el conjunto de caracteres de base de datos. Un carácter es mayor que otra si tiene un valor numérico mayor que el otro en el juego de caracteres.

      Según el juego de caracteres ASCII los caracteres del 0-9 toman los valores 48-57.

      Saludos.

      Reply
  • huellajuvenil

    01/05/2015

    Antonio te pongo un caso si yo necesito validar la calidad de datos de un nro. móvil de 9 dígitos y algunos registros tiene solo 5, se puede mostrar ese resultado como perfilamiento??

    Reply
  • huellajuvenil

    11/06/2015

    man una expresión regular para comparar dos campos de una tabla, tengo dirección 1 y dirección 2 que necesito saber si se repite o no

    Reply

Deja un comentario