Cómo usar expresiones regulares (RegEx) en SQL Server para generar datos de prueba aleatorios

Una expresión regular (abreviada  regex o regexp por su acrónimo en inglés, a veces llamadas  expresiones racionales) es una secuencia de caracteres que forman un patrón de búsqueda, principalmente para usarse en funciones de coincidencia de caracteres y “buscar y reemplazar”. Ellos ueden ser usados también como generadores de datos, siguiendo el concepto de expresiones regulares reversas, y proveyendo datos de prueba aleatorios a usarse para probar bases de datos.

Usando expresiones regulares para crear datos de prueba realistas

Una de las piezas de datos más usada es un número de teléfono, y ese es un buen ejemplo de datos que pueden ser usados para popular una base de datos. Para nuestro ejemplo usaremos números de teléfono basados en Estado Unidos, y mostraremos cómo pueden ser generados usando la expresión regular.

Para explicar esto, primero la sintaxis de los números telefónicos con base en Estados Unidos debe ser entendida. Ellos están definidos por la North American Numbering Plan (NANP). La NANP es un sistema de áreas de planes de numeración (numbering plan areas, NPA) usando números de teléfono consistentes en un código de área de tres dígitos, un código de oficina central de tres dígitos, y un número de estación de cuatro números. El ejemplo de un número de teléfono de Estado Unidos se muestra a continuación:

### – ###- ####
Código de área – código de oficina central – número de estación

La regla para un número telefónico real de Estados Unidos es que el primer dígito del código de área de tres dígitos puede estar en un rango de 2-9, esto aplica al código de oficina central de tres dígitos también. El último número de estación de cuatro dígitos puede usar números en un rango de 0-9.

Siguiendo esta regla, crearemos una expresión regular que generará número telefónicos aleatorios de Estados Unidos usando elementos de sintaxis usados para expresiones regulares en generación de datos, de la lista a continuación:

Sintaxis

Ejemplo

Datos generados

. = Indica cualquier caracter

John

John

\ = Indica que el caracter que sigue es interpretado como es, en lugar de como un carácter especial

\.2

.2

() = Operadores que están dentro del paréntesis están agrupados

(Gr34T)

Gr34T

{n} = Genera n instancias del elemento anterior

ab{2}

abb

{n,m} = Genera al menos n instancias pero no más de m instancias del elemento previo

Rd2{2,5}

Rd22 or Rd2222 (for example)

{n,} = Genera n o más instancias del elemento previo

T{3,}

TTT or TTTT or TTTTT (for example)

* = Genera cero o más instancias del elemento anterior

Rom3*

Rom or Rom33 or Rom333 (for example)

+ = Genera una o más instancias del elemento anterior

Tun4+

Tun4 or Tun444 (for example)

? = Genera cero o una instancia del elemento anterior

Op3n?

Op3 or Op3n

| = Genera un elemento en cada lado del caracter |

True|False

True or False

[] = Genera cualquier caracter dentro de los corchetes

[tRu3]

t or R or u or 3

[a-z]= Genera cualquier caracter en el rango especificado de caracteres

[0-9A-Z]

U or 5 or Z (for example)

[^abc] = Genera cualquier caracter excepto aquello dentro de los corchetes

[^0aT]

Y or 5 or + (but not 0, a or T)(for example)

Dado que el primer dígito del código de área de tres dígitos puede ser estar sólo en el rango 2-9, el siguiente elemento de sintaxis es usado [2-9], que generará un número aleatorio desde el rango 2-9.

Los siguiente dos dígitos del área serán generados usando los siguientes elementos de sintaxis [0-9]{2}, donde [0-9] establece un rango 0-9 desde el cual los números aleatorios serán generados, y {2} instruye al generados tomar dos números aleatorios desde el rango [0-9] establecido antes. Así que la expresión regular para crear un código de área de tres dígitos lucirá como esto [2-9][0-9]{2}y dará resultados aleatorios como 254, 634, 893, etc.

Para dividir visualmente los grupos de dígitos en un número de teléfono, el símbolo de guion es usado (-) que no tiene valor de sintaxis, sólo visual.

Un código de oficina central de tres dígitos usa las mismas reglas que el código de área de tres dígitos, así que la expresión regular para ello es la misma que la del código de área de tres dígitos, y es usada después del símbolo de guion. Esto hará que la expresión regular actual sea vea así [2-9][0-9]{2}[2-9][0-9]{2}, lo cual producirá los siguientes posibles resultados: 367-245, 743-854, 423-522, etc.

De nuevo, el símbolo de guion es usado para dividir visualmente grupos de dígitos.

El número de estación de cuatro dígitos puede usar números en un rango 0-9. Para crear una expresión regular para ello el elemento de sintaxis para un rango [0-9] y el elemento de sintaxis para cuántos números serán elegidos de un rango dado {4} serán usados, lo cual da la siguiente expresión regular [0-9]{4}. Ejemplos de los posibles resultados de esta expresión son: 0245, 4392, 7402, etc.

La expresión regular completa para generar números realistas de teléfonos de Estados Unidos se ve así:

[2-9][0-9]{2}-[2-9][0-9]{2}-[0-9]{4},

Y los números aleatorios generados se verán así: 254-573-9330, 453-623-0521, 832-571-9562, etc.

Esta expresión regular es usada en las siguiente opciones disponibles para la generación de datos aleatorios.

Librerías RegEx para lenguajes de programación como generadores de datos

Hay muchas librerías disponibles en internet que pueden ser usadas en lenguajes de programación como PHP, Java, C++, las cuales permiten la generación de datos usando expresiones regulares. Uno de los ejemplos sería xeger, una librería Java para generar texto aleatorio de expresiones regulares. Usaremos la expresión regular: [2-9][0-9]{2}-[2-9][0-9]{2}-[0-9]{4} en el ejemplo. Usando la librería, usted puede generar Cadenas coincidiendo con este patrón así:

String regex = "[2-9][0-9{2}-[2-9][0-9{2}-[0-9]{4}";
Xeger generator = new Xeger(regex);
String result = generator.generate();
assert result.matches(regex);

Usar este código produciría los siguientes datos aleatorios:

239-456-8845
345-542-5392
584-583-2940
879-220-3412
733-430-3290

Creando un Plan de Generación de Datos en Visual Studio 2010 usando el generador de expresiones regulares (RegEx)

Otra opción es apalancar Visual Studio 2010 y su característica para generar datos de prueba aleatorios usando un Plan de Generación de Datos. Un Plan de Generación de Datos permite seleccionar cómo los datos de prueba serán generados para tablas y columnas específicas. Tiene muchos generadores de datos integrados, los cuales generan datos aleatorios de acuerdo al tipo de datos de la columna. Las propiedades de estos generadores pueden ser cambiados, para definir el rango y formato de los datos de prueba generados.

Uno de esos generadores que nos interesan es el generador Regular Expression, y puede ser usado de la siguiente manera:

Inicie Visual Studio 2010 y cargue su proyecto de base de datos. Haga clic derecho en el nodo del proyecto en Solution Explorer y vaya al menú Add y haga clic en el elemento New:

Desde el diálogo Add New Item elija el nodo Data Generation Plan debajo del nodo Database Project y seleccione la plantilla Data Generation Plan de la lista. El nombre del plan de generación de datos puede ser definido en el campo Name y para proceder haga clic en el botón Add:

Los objetos de esquema del proyecto de base de datos son escaneados y todas las tablas que existen son listadas por el Plan de Generación de Datos. Todas las tablas son incluidas en el plan para generación de datos por defecto. Seleccione las tablas para las cuales los datos son generados, e ingrese el número de filas que serán generadas para las tablas seleccionadas:

A continuación, seleccione la Columna para la cual el generador Regular Expression (RegEx) será usado y en el menú Generator seleccione el generador Regular Expression. Después de que el generador esté configurado, la expresión regular que será usada para generar datos aleatorios debería ser ingresada. Esto se hace en la ventana de propiedades de la columna seleccionada, la cual es accedida haciendo clic derecho en la columna y seleccionando el elemento Properties o presionando la tecla F4. En el campo de expresiones ingrese la expresión regular deseada (en el ejemplo a continuación, la expresión regular, explicada al principio del artículo, [2-9][0-9]{2}-[2-9][0-9]{2}-[0-9]{4} generará números aleatorios de teléfonos de Estados Unidos):

Los datos generados se verían así:

Para pre visualizar los datos de prueba que serán generados, haga clic derecho en la pantalla de generación de datos y haga clic en Preview Data Generation. Esto mostrará los datos de prueba en una pantalla de pre visualización.

Si la pre visualización luce bien, el siguiente paso es generar datos reales. Esto se logra haciendo clic en el botón Generate Data en la barra de herramientas o presionando la tecla F5. Esto abrirá el asistente Connect to Database, donde los detalles de la base de datos son especificados:

Para ejecutar el plan de generación de datos y generar datos para las tablas seleccionadas, una conexión de base de datos tiene que ser especificada, y luego hacer clic en el botón OK.

Por favor note que la generación de datos de prueba fue deprecada después de Visual Studio 2010.

Generando datos aleatorios de prueba usando el generador Regular Expression en ApexSQL Generate

ApexSQL Generate es una herramienta de generación de datos SQL, la cual tiene la habilidad de generar datos rápidamente, usando varias fuentes con una variedad de generadores de datos.

Una de sus características es generar datos aleatorios usando las expresiones regulares.

El objetivo es ingresar una expresión regular que será usada para popular columnas con datos de prueba. Esto puede ser hecho en la siguiente forma:

  1. Conéctese a la base de datos usando la conexión Database o Alias:

  2. En la cuadrícula principal, seleccione la tabla para la cual se generarán los datos de prueba, y desde Generation options establezca el número o filas a ser generados:

  3. Luego seleccione la columna, la cual será poblada con los datos:

  4. Desde la lista Generator, seleccione el generador Regular expression:

  5. Ingrese la expresión regular en el campo, y después eso usted puede ver en el panel de pre visualización cómo se verán los datos generados. A medida que la expresión regular es ingresada en el campo, el panel de pre visualización generará automáticamente la pre visualización de las primeras cien filas de datos que serán generadas, basado en la entrada actual. En el ejemplo a continuación, hemos usado la expresiçon regular que fue explicada al principio del artículo [2-9][0-9]{2}-[2-9][0-9]{2}-[0-9]{4}, la cual generará números de teléfono de Estados Unidos aleatoriamente:

La opción Unique asegura que valores únicos serán generados.

Lo importante a notar es que el conjunto generado de valores es definido por el valor Seed. Por cada valor Seed, hay exactamente un conjunto de posibles datos generados. Por ejemplo, cuando la expresión regular del principio del artículo es usada, y el valor Seed es 0, las primeras filas de datos generados serían:

Si el valor Seed sería por ejemplo 53, el conjunto resultante sería:

El conjunto generado puede ser repetido usando la misma expresión regular y el mismo valor Seed. Esto puede ser usado cuando dos o más columnas tienen que ser pobladas con los mismos datos y en el exacto mismo orden.

Más información acerca del valor Seed se puede encontrar en el artículo de KB “Seed feature in ApexSQL Generate”.

Después de que todas las opciones están establecidas, el proceso de generación de datos puede ser ejecutado por el botón Generate en la ventana principal.

Traductor: Daniel Calbimonte

agosto 16, 2016