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.
Contenido relacionado seleccionado:
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. |
Puedes listar caracteres individualmente; por ejemplo, net[wrx] coincidirá con netw , netr y netx pero no con netz. |
|
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. |
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. |
n{3} coincidirá con nnn, nnnn y nnnd (porque todos incluyen n tres veces seguidas), pero no coincidirá con nnw. |
|
|
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. |
Gr(a|e)y coincidirá con Gray o Grey. |
|
Secuencia de escape |
\ |
El metacarácter que sigue a la barra inclinada se usará como literal. |
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}[- |
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()<>]+ |
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
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.
Aprende más sobre este tema
Los próximos cinco minutos de cumplimiento: construyendo seguridad de datos basada en la identidad a través de APAC
De ruido a acción: convirtiendo el riesgo de datos en resultados medibles
Leyes de Privacidad de Datos por Estado: Diferentes Enfoques para la Protección de la Privacidad
Ejemplo de Análisis de Riesgos: Cómo Evaluar los Riesgos
El Triángulo de la CIA y su Aplicación en el Mundo Real