Magic Quadrant™ para la gestión de acceso privilegiado 2025: Netwrix reconocida por cuarto año consecutivo. Descarga el informe.

Plataforma
Centro de recursosBlog
Expresiones Regulares para Principiantes: Cómo Empezar a Descubrir Datos Sensibles

Expresiones Regulares para Principiantes: Cómo Empezar a Descubrir Datos Sensibles

May 29, 2019

Cualquier solución de descubrimiento y clasificación de datos depende en gran medida de las expresiones regulares (a veces llamadas RegExes, REs o patrones RegEx) para identificar datos sensibles. Pero, ¿qué son las RegExes y cómo se pueden utilizar para descubrir datos sensibles? Descubrámoslo.

Las expresiones regulares son un lenguaje de programación pequeño pero altamente especializado; básicamente son comodines potenciados. Utilizando este pequeño lenguaje, especificas reglas que definen las cadenas que deseas coincidir. Por ejemplo, puedes definir una RegEx que coincida con direcciones de correo electrónico, PII, PHI o números de tarjetas de crédito.

Componentes de Regex

Una expresión regular puede incluir literales y metacaracteres.

Literals

Cualquier carácter individual, excepto aquellos reservados como metacaracteres, ya es una expresión regular en sí mismo. Por ejemplo, www es una coincidencia para www.Netwrix.com pero wwz no lo es. Note que las expresiones regulares son sensibles a mayúsculas y minúsculas, por lo que www no coincidirá con WWW ni wWw.

Metacaracteres

Los siguientes caracteres individuales no se interpretan como literales sino que tienen significados especiales:

  • . ^ $ * + ? { } [ ] | ( )

La siguiente tabla describe cómo funciona cada uno de estos metacaracteres.

Tipo

Meta-caracteres

Descripción

Ejemplos

El punto

.

El punto significa cualquier carácter.

net.rix coincidirá tanto con www.netwrix.com como con www.netfrix.com.

Clase de personaje

[]

Coincidencias para cualquier cosa dentro de los corchetes.
La única excepción es el carácter ^ . Dentro de una clase, al principio, el ^ significa excepción de la búsqueda. Por ejemplo, [^n] coincidirá con cualquier carácter excepto n; esto se llama una clase de caracteres negados.
Nota que los metacaracteres (con una excepción) no están activos dentro de las clases. Por ejemplo, [net$] coincidirá con cualquiera de los caracteres n, e, t o $ ($ es un metacarácter, pero dentro de una clase de caracteres solo coincide con $).
La única excepción es el carácter ^. Dentro de una clase, al principio, el ^ significa excepción de la búsqueda. Por ejemplo, [^n] coincidirá con cualquier carácter excepto n; esto se llama una clase de caracteres negados.

Puedes listar caracteres individualmente; por ejemplo, net[wrx] coincidirá con netw , netr y netx pero no con netz.
O puedes buscar un rango de caracteres dando dos caracteres y separándolos con un guion; por ejemplo, net[a-z] coincidirá con neta, netw y netf pero no con net1.

Anclas

^

Se utiliza para coincidir con caracteres al comienzo de una cadena

^https coincidirá con https://netwrix.com pero no con www.netwrix.com ni con http://netwrix.com

$

Se utiliza para coincidir con caracteres al final de una cadena

com$ coincidirá con www.netwrix.com o telecom pero no con computer.

Iteración / cuantificadores

¿

Coincide con el elemento anterior cero o una vez (siempre coincidirá si el carácter no se encontró). Es excelente para encontrar caracteres opcionales.

color coincidirá tanto con color como con colour.

*

Coincide con el elemento anterior cero o más veces en lugar de cero o una vez. Es excelente para encontrar series opcionales de caracteres.

ne*t coincidirá con nt (cero caracteres e), net (un caracter e), neeet (tres caracteres e), y así sucesivamente.

+

Coincide con el elemento anterior una o más veces.
Es importante prestar atención a la diferencia entre * y +. * coincide cero o más veces, por lo que lo que se repite puede no estar presente en absoluto; + requiere al menos una ocurrencia.

ne+t coincidirá con net y neeet pero no con nt.

|

El operador de elección coincide con la expresión anterior o la expresión posterior al operador.

Netwrix coincidirá con Netwrix y Netwrix.

{}

{x} coincide si el elemento que lo precede se encuentra exactamente x veces.
{x,y} coincide si el elemento anterior se encuentra al menos x veces, pero no más de y veces.

n{3} coincidirá con nnn, nnnn y nnnd (porque todos incluyen n tres veces seguidas), pero no coincidirá con nnw.
9{3} coincidirá con 999, 1234999124 y text999text, pero no con 84299238, 9909, ni page992.
n{3,5} coincidirá con nnn, nnnn y nnnnn.

Bloqueando y capturando

()

Define una subexpresión que se puede recordar más tarde utilizando un atajo: La primera subexpresión entre paréntesis se puede recordar con \1, la segunda con \2 y así sucesivamente.
Los paréntesis se utilizan normalmente con | (el operador de elección) dentro o con cuantificadores por fuera.

Gr(a|e)y coincidirá con Gray o Grey.
[0-9]([-])[0-9]\1[0-9] coincidirá con 3-4-2 y 4-6-1, pero no con 1-23, 42-1 ni 234.

Secuencia de escape

\

El metacarácter que sigue a la barra inclinada se usará como literal.
Tenga en cuenta que algunas secuencias que comienzan con \ no son secuencias de escape. En cambio, representan conjuntos predefinidos de caracteres que suelen ser útiles, como el conjunto de dígitos, el conjunto de letras o el conjunto de cualquier cosa que no sea un espacio en blanco. Los más populares se enumeran a continuación como “metacarácteres especiales”.

www\.netwrix\.com coincidirá con www.netwrix.com pero no con www,netwrix,com.

Caracteres especiales metacaracteres

\s

Coincide con cualquier carácter de espacio en blanco (un espacio, una tabulación, un salto de línea o un avance de formulario).

Netwrix Auditor coincidirá con Netwrix Auditor, y Netwrix Auditor, pero no con Netwrix Auditor ni Netwrix Auditor.

\S

Coincide con cualquier carácter que no sea un espacio en blanco.

Netwrix coincidirá con Netwrix y Netwrix.

\w

Coincide con cualquier carácter alfanumérico.

\w\w\w coincidirá con net, dfw y Netwrix.

\W

Coincide con cualquier carácter no alfanumérico.

Netwrix coincidirá con Netwrix y Netwrix.

\d

Coincide con cualquier dígito decimal.

Netwrix\d\d coincidirá con Netwrix80 y Netwrix90.

\D

Coincide con cualquier carácter que no sea un dígito.

Netwrix\D coincidirá con Netwrix) y Netwrix-.

\a

Coincide con cualquier carácter alfabético, ya sea mayúscula o minúscula.

Netwrix coincidirá con Netwrix, Netwrix y Netwrix.

\b

Define un límite de palabra.

\brix coincidirá con rix y rixon pero no con Netwrix.

\B

Define un límite que no es de palabra

\Brix coincidirá con Netwrix y trix pero no con rixon.

Combinaciones de metacaracteres

Ahora conocemos casi todos los metacaracteres y estamos listos para combinarlos.

Ejemplo: Buscando números de matrícula

Supongamos que necesitamos encontrar un número de licencia en el formato aaa-nnnn — los primeros tres dígitos deben ser alfanuméricos y los últimos cuatro deben ser numéricos. El guion puede ser reemplazado por cualquier carácter o faltar por completo.

La expresión regular para esto será:

  • b[0-9A-Z]{3}([^ 0-9A-Z]|s)?[0-9]{4}b

Analicemos esta RegEx:

  • b requiere un límite de palabra, por lo que las cadenas coincidentes no pueden ser parte de una cadena más grande.
  • [0-9A-Z]{3} significa que los tres primeros caracteres deben ser alfanuméricos.
  • ([^ 0-9A-Z]|s)? significa que la siguiente parte de la cadena debe ser un delimitador — un carácter no alfanumérico o un carácter de espacio en blanco — o nada en absoluto.
  • [0-9]{4} significa que la siguiente parte de la cadena debe ser de 4 dígitos.
  • b especifica otro límite de palabra.

Esta expresión regular coincidirá con los siguientes números de licencia: NT5-6345, GH3 9452, XS83289

Sin embargo, no coincidirá con estos números de licencia: ZNT49371, HG3-29347, nt4-9371

Ejemplo: Buscando números de Seguro Social

Otro buen ejemplo es el número de Seguro Social de EE. UU. (SSN), que siempre tiene el formato nnn-nn-nnnn.

La RegEx más sencilla es la siguiente:

  • [0-9]{3}-[0-9]{2}-[0-9]{4}

Sin embargo, esto generará falsos positivos, ya que no todos los números que tienen esta forma son SSN legítimos. Además, se perderán algunos SSN reales, incluyendo aquellos que estén escritos sin los guiones. Para obtener resultados más precisos, deberíamos construir uno más complejo. Sabemos que:

  • Ningún grupo de dígitos puede ser todo ceros.
  • El primer bloque no puede ser 666 ni 900-999.
  • Los números de seguro social pueden escribirse con caracteres de espacio en blanco en lugar de guiones, o sin ningún delimitador.
  • If the first block starts with a 7, it must be followed by a number between 0 and 6 and then any third digit.

Por lo tanto, la RegEx avanzada se verá así:

  • b(?!000|666|9d{2})([0-8]d{2}|7([0-6]d))([-]?|s{1})(?!00)dd2(?!0000)d{4}b

Como antes, b al principio y al final especifican un límite de palabra. Vamos a analizar más profundamente cada bloque de números intermedio.

El primer bloque

  • (?!000|666|9d{2}) es una anticipación negativa que especifica que el número no debe comenzar con 000, 666, o 9 seguido de dos dígitos cualesquiera.
  • ([0-8]d{2} especifica que la cadena debe comenzar con un dígito entre 0 y 8 y tener dos dígitos más (0-9) después de eso.
  • |7[0-6]d)) dice que debe comenzar con 7, el siguiente dígito debe estar entre 0 y 6, seguido de cualquier dígito.
  • ([-]?|s{1}) especifica que después de los tres dígitos, debe haber un guion, un carácter de espacio en blanco o nada en absoluto para marcar el final del primer bloque.

El segundo bloque

  • (?!00) es otro look-ahead negativo que especifica que no debe haber 00 en el segundo bloque.
  • dd indica que debe haber dos dígitos cualesquiera en el segundo bloque.
  • 2 coincide con el mismo texto que el segundo grupo de captura, que es ([-]?|s{1}), por lo que especifica que el segundo bloque puede terminar con un guion, un carácter de espacio en blanco o sin ningún carácter adicional.

El tercer bloque

  • (?!0000) es otro look-ahead negativo que especifica que no puede haber cuatro ceros en el tercer bloque.
  • d{4} requiere cualquier cuatro dígitos en el tercer bloque del SSN.

Ejemplos de RegExes populares

Para encontrar

Utiliza esta RegEx

Ejemplo de coincidencia

Direcciones de correo electrónico

^[\w\.=-]+@[\w\.-]+\.[\w]{2,3}$

T.Simpson@netwrix.com

Números de Seguro Social de EE. UU.

\b(?!000|666|9\d{2})([0-8]\d{2}|7([0-6]\d))([-]?|\s{1})(?!00)\d\d\2(?!0000)\d{4}\b

513-84-7329

Direcciones IPV4

^\d{1,3}[.]\d{1,3}[.]\d{1,3}[.]\d{1,3}$

192.168.1.1

Fechas en formato MM/DD/AAAA

^([1][12]|[0]?[1-9])[\/-]([3][01]|[12]\d|[0]?[1-9])[\/-](\d{4}|\d{2})$

05/05/2018

MasterCard numbers

^(?:5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}$

5258704108753590

Visa card numbers

\b([4]\d{3}[\s]\d{4}[\s]\d{4}[\s]\d{4}|[4]\d{3}[-]\d{4}[-]\d{4}[-
]\d{4}|[4]\d{3}[.]\d{4}[.]\d{4}[.]\d{4}|[4]\d{3}\d{4}\d{4}\d{4})\b

4563-7568-5698-4587

American Express card numbers

^3[47][0-9]{13}$

34583547858682157

U.S. ZIP codes

^((\d{5}-\d{4})|(\d{5})|([A-Z]\d[A-Z]\s\d[A-Z]\d))$

97589

File paths

\\[^\\]+$

\\fs1\shared

URLs

(?i)\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+
|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))

www.netwrix.com

Recursos útiles sobre expresiones regulares (RegEx)

  • https://regexr.com and https://regex101.com te ayudarán a comprobar tus expresiones regulares mostrando la sintaxis resaltada y ofreciendo sugerencias interactivas.
  • https://regexcrossword.com es un divertido juego de crucigramas en el que las pistas están definidas mediante expresiones regulares.
  • https://www.regular-expressions.info es un excelente sitio con información detallada sobre expresiones regulares. Además, la herramienta Notepad++ incluye una extensión auxiliar para RegEx que puede resultarte muy útil mientras trabajas con expresiones regulares.

Compartir en

Aprende más

Acerca del autor

Asset Not Found

Jeff Melnick

Director de Ingeniería de Sistemas

Jeff es un ex Director de Ingeniería de Soluciones Globales en Netwrix. Es un bloguero, orador y presentador de Netwrix desde hace mucho tiempo. En el blog de Netwrix, Jeff comparte lifehacks, consejos y trucos que pueden mejorar drásticamente tu experiencia en la administración de sistemas.