regular-expressions-es
regular-expressions-es
#regex
Tabla de contenido
Acerca de 1
Observaciones 2
Recursos 3
Versiones 3
PCRE 3
Perl 4
.RED 4
Idiomas: C # 4
Java 4
JavaScript 4
Pitón 5
Oniguruma 5
Aumentar 5
POSIX 5
Idiomas: Bash 5
Examples 6
Guia de personajes 6
Introducción 9
Observaciones 9
Examples 9
Observaciones 12
Examples 12
Observaciones 13
Clases simples 13
Clases comunes 13
Clases de negacion 13
Examples 14
Los basicos 14
Examples 21
Observaciones 22
Examples 22
Observaciones 24
Examples 24
Parámetros 25
Observaciones 26
Codicia 26
pereza 26
Examples 26
Capítulo 9: Escapando 29
Examples 29
Pitón 29
C ++ (11+) 29
VB.NET 29
DO# 29
Instrumentos de cuerda 30
Barras invertidas 30
Escapar de la sustitución 31
Excepciones BRE 31
/ Delimitadores / 32
Examples 34
Sintaxis 37
Observaciones 37
Examples 37
Cómo se ve un grupo de captura con nombre 37
Sintaxis 39
Observaciones 39
Recursos adicionales 39
Examples 39
Límites de palabras 40
El metacarácter \b 40
Ejemplos: 40
El metacarácter \B 41
Ejemplos: 41
Sintaxis 42
Observaciones 42
Examples 42
Lo esencial 42
Introducción 44
Observaciones 44
Modificadores PCRE 44
Modificadores de Java 44
Examples 45
Modificador DOTALL 45
Modificador MULTILINE 46
Modificador UNICODE 47
PCRE_DOLLAR_ENDONLY modificador 48
Modificador PCRE_ANCHORED 48
Modificador PCRE_UNGREEDY 49
Modificador PCRE_INFO_JCHANGED 49
Modificador PCRE_EXTRA 49
Examples 50
Espacios finales 51
Espacios principales 52
Observaciones 52
Seleccionar una línea determinada de una lista basada en una palabra en cierta ubicación 52
Observaciones 54
Examples 54
Comienzo de linea 54
Cuando el modificador de multilínea (?m) está desactivado , ^ coincide solo con el princip 54
Cuando se activa el modificador multilínea (?m) , ^ coincide con el comienzo de cada línea 55
Modificador multilínea 56
Observaciones 58
Examples 58
Definiciones de subpattern 58
Examples 61
Lo esencial 61
Referencias ambiguas 61
Observaciones 63
Examples 63
Examples 65
¿Cómo evitarlo? 66
Parámetros 67
Examples 67
Reemplazo avanzado 69
Examples 72
NFA 72
Principio 72
Optimizaciones 72
Ejemplo 72
DFA 74
Principio 74
Trascendencia 74
Ejemplo 74
Examples 76
¿Por qué el punto (.) No coincide con el carácter de nueva línea ("\ n")? 76
¿Por qué una expresión regular omite algunos paréntesis / paréntesis de cierre y los combi 76
Examples 78
Examples 84
Una contraseña que contiene al menos 1 mayúscula, 1 minúscula, 1 dígito, 1 carácter especi 84
Una contraseña que contiene al menos 2 mayúsculas, 1 minúscula, 2 dígitos y tiene una long 85
Creditos 87
Acerca de
You can share this PDF with anyone you feel could benefit from it, downloaded the latest version
from: regular-expressions
It is an unofficial and free Regular Expressions ebook created for educational purposes. All the
content is extracted from Stack Overflow Documentation, which is written by many hardworking
individuals at Stack Overflow. It is neither affiliated with Stack Overflow nor official Regular
Expressions.
The content is released under Creative Commons BY-SA, and the list of contributors to each
chapter are provided in the credits section at the end of this book. Images may be copyright of
their respective owners unless otherwise specified. All trademarks and registered trademarks are
the property of their respective company owners.
Use the content presented in this book at your own risk; it is not guaranteed to be correct nor
accurate, please send your feedback and corrections to [email protected]
https://riptutorial.com/es/home 1
Capítulo 1: Empezando con Expresiones
Regulares
Observaciones
Para muchos programadores, la expresión regular es una especie de espada mágica que lanzan
para resolver cualquier tipo de situación de análisis de texto. Pero esta herramienta no es nada
mágico, y aunque es muy bueno en lo que hace, no es un lenguaje de programación con todas
las funciones (es decir, no es Turing completo).
Una gramática regular es la gramática más simple expresada por la Jerarquía de Chomsky .
En pocas palabras, un lenguaje regular se expresa visualmente por lo que puede expresar una
NFA, y aquí hay un ejemplo muy simple de NFA:
Y el lenguaje de Expresión Regular es una representación textual de tal autómata. Ese último
ejemplo es expresado por el siguiente regex:
^[01]*1$
Que coincide con cualquier cadena que comience con 0 o 1 , repitiendo 0 o más veces, que
https://riptutorial.com/es/home 2
termine con 1 . En otras palabras, es una expresión regular para hacer coincidir los números
impares de su representación binaria.
Una expresión regular recursiva como la siguiente (que coincide con paréntesis) es un ejemplo de
tal implementación:
{((?>[^\(\)]+|(?R))*)}
(este ejemplo no funciona con el motor de re de Python, sino con el motor de regex o con el motor
de PCRE ).
Recursos
Para obtener más información sobre la teoría detrás de las expresiones regulares, puede
consultar los siguientes cursos disponibles en el MIT:
Cuando está escribiendo o depurando una expresión regular compleja, existen herramientas en
línea que pueden ayudar a visualizar las expresiones regulares como autómatas, como el sitio de
debuggex .
Versiones
PCRE
Versión Publicado
2 2015-01-05
1 1997-06-01
https://riptutorial.com/es/home 3
Utilizado por: PHP 4.2.0 (y superior), Delphi XE (y superior), Julia , Notepad ++
Perl
Versión Publicado
1 1987-12-18
2 1988-06-05
3 1989-10-18
4 1991-03-21
5 1994-10-17
6 2009-07-28
.RED
Versión Publicado
1 2002-02-13
4 2010-04-12
Idiomas: C #
Java
Versión Publicado
4 2002-02-06
5 2004-10-04
7 2011-07-07
SE8 2014-03-18
JavaScript
Versión Publicado
1.2 1997-06-11
https://riptutorial.com/es/home 4
Versión Publicado
1.8.5 2010-07-27
Pitón
Versión Publicado
1.4 1996-10-25
2.0 2000-10-16
3.0 2008-12-03
3.5.2 2016-06-07
Oniguruma
Versión Publicado
Inicial 2002-02-25
5.9.6 2014-12-12
Onigmo 2015-01-20
Aumentar
Versión Publicado
0 1999-12-14
1.61.0 2016-05-13
POSIX
Versión Publicado
BRE 1997-01-01
ANTES DE 2008-01-01
Idiomas: Bash
https://riptutorial.com/es/home 5
Examples
Guia de personajes
Tenga en cuenta que algunos elementos de sintaxis tienen un comportamiento diferente según la
expresión.
Sintaxis Descripción
Cuando se incluye entre corchetes indica to ; por ejemplo, [3-6] coincide con los
-
caracteres 3, 4, 5 o 6.
(?<name>
Subexpresiones de grupos, y las captura en un grupo nombrado
... )
Cualquier carácter entre estos paréntesis debe coincidir una vez. NB: ^
siguiendo el corchete abierto niega este efecto. - aparecer dentro de los
[ ... ]
corchetes, se puede especificar un rango de valores (a menos que sea el primer
o último carácter, en cuyo caso solo representa un guión normal).
https://riptutorial.com/es/home 6
Sintaxis Descripción
\D sin dígitos
https://riptutorial.com/es/home 7
Sintaxis Descripción
\d dígito
\e escapar
\f form feed
\n linea de alimentación
\r retorno de carro
\S espacio no blanco
\s espacio en blanco
\t lengüeta
\v pestaña vertical
\W no palabra
https://riptutorial.com/es/home 8
Capítulo 2: Agrupación atómica
Introducción
Los grupos regulares que no capturan permiten que el motor vuelva a ingresar al grupo e intente
hacer coincidir algo diferente (como una alternancia diferente, o hacer coincidir menos caracteres
cuando se usa un cuantificador).
Los grupos atómicos difieren de los grupos regulares que no capturan, ya que está prohibido el
retroceso. Una vez que el grupo sale, toda la información de seguimiento se descarta, por lo que
no se pueden intentar coincidencias alternativas.
Observaciones
Un cuantificador posesivo se comporta como un grupo atómico en el sentido de que el motor no
podrá retroceder sobre un token o grupo.
Los siguientes son equivalentes en términos de funcionalidad, aunque algunos serán más rápidos
que otros:
a*+abc
(?>a*)abc
(?:a+)*+abc
(?:a)*+abc
(?:a*)*+abc
(?:a*)++abc
Examples
Agrupando con (?>)
ABC
La expresión regular intentará coincidir comenzando en la posición 0 del texto, que está antes de
la A en ABC .
https://riptutorial.com/es/home 9
BC
como el texto restante para que coincida. Se sale del grupo (?>a*) y se intenta abc en el texto
restante, que no coincide.
El motor no puede retroceder en el grupo atómico, por lo que el paso actual falla. El motor se
mueve a la siguiente posición en el texto, que estaría en la posición 1, que está después de la A y
antes de la B de ABC .
La expresión regular (?>a*)abc se intenta de nuevo, y (?>a*) coincide con A 0 veces, dejando
BC
como el texto restante para que coincida. Se sale del grupo (?>a*) y se intenta abc , que falla.
Nuevamente, el motor no puede retroceder en el grupo atómico, por lo que el paso actual falla. La
expresión regular continuará fallando hasta que todas las posiciones en el texto se hayan
agotado.
Dado el mismo texto de ejemplo, pero con la expresión que no distingue entre mayúsculas y
minúsculas (?:a*)abc , se producirá una coincidencia, ya que se permite que se produzca un
retroceso.
ABC
dejando
BC
como el texto restante para que coincida. Se sale del grupo (?:a*) y se intenta abc en el texto
restante, que no coincide.
El motor retrocede al grupo (?:a*) e intenta hacer coincidir 1 carácter menos: en lugar de hacer
coincidir el carácter de 1 A , intenta hacer coincidir los caracteres de 0 A , y se abandona el grupo
(?:a*) . Esto deja
ABC
como el texto restante para que coincida. El regex abc ahora puede coincidir exitosamente con el
texto restante.
https://riptutorial.com/es/home 10
Otro ejemplo de texto
Considere este texto de ejemplo, con grupos atómicos y no atómicos (de nuevo, sin distinción de
mayúsculas y minúsculas):
AAAABC
La expresión regular intentará coincidir comenzando en la posición 0 del texto, que está antes de
la primera A en AAAABC .
El patrón que usa el grupo atómico (?>a*)abc no podrá coincidir, se comportará de manera casi
idéntica al ejemplo ABC atómico anterior: los 4 caracteres A primero se comparan con (?>a*)
(dejando a BC como el texto restante para coincidir), y abc no puede coincidir en ese texto. El
grupo no puede volver a ingresarse, por lo que la coincidencia falla.
El patrón que usa el grupo no atómico (?:a*)abc podrá coincidir, comportándose de manera
similar al ejemplo ABC no atómico anterior: todos los 4 caracteres A se comparan primero con
(?:a*) (dejando BC como el texto restante para coincidir), y abc no puede coincidir en ese texto. El
grupo es capaz de volver a introducir, por lo que uno menos A se intenta: 3 A los personajes se
emparejan en lugar de 4 (dejando ABC como el resto del texto para que coincida), y abc es capaz
de igualar con éxito en ese texto.
https://riptutorial.com/es/home 11
Capítulo 3: Caracteres del ancla: Dólar ($)
Observaciones
Una gran cantidad de motores de expresiones regulares utilizan un modo "multilínea" para buscar
varias líneas en un archivo de forma independiente.
Por lo tanto, al usar $ , estos motores coincidirán con los finales de todas las líneas. Sin embargo,
los motores que no utilizan este tipo de modo multilínea solo coincidirán con la última posición de
la cadena proporcionada para la búsqueda.
Examples
Une una letra al final de una línea o cadena
g$
Lo anterior coincide con una letra (la letra g ) al final de una cadena en la mayoría de los motores
de expresiones regulares (no en Oniguruma , donde $ delimitador coincide con el final de una
línea de forma predeterminada, y el modificador m ( MULTILINE ) se usa para hacer un .
encontrado caracteres, incluyendo caracteres de salto de línea, como un modificador dotall en la
mayoría de otros sabores de expresiones regulares NFA). El ancla $ coincidirá con la primera
aparición de una letra g antes del final de las siguientes cadenas:
Las anclas son personajes que, de hecho, no coinciden con ningún carácter en un
strin g
En la mayoría de los tipos de expresiones regulares, $ anchor también puede coincidir antes de
un carácter de nueva línea o de salto de línea (secuencia), en un modo MULTILINE , donde $
coincide al final de cada línea en lugar de solo al final de una cadena. Por ejemplo, usando g$
como nuestra expresión regular de nuevo, en modo multilínea, los caracteres en cursiva en la
siguiente cadena coincidirán:
tvxlt obofh necpu riist g\n aelxk zlhdx lyogu vcbke pzyay wtsea wbrju jztg\n drosf ywhed bykie
lqmzg wgyhc lg\n qewrx ozrvm jwenx
https://riptutorial.com/es/home 12
Capítulo 4: Clases de personajes
Observaciones
Clases simples
Regex Partidos
Clases comunes
Algunos grupos / rangos de caracteres se usan tan a menudo, tienen abreviaturas especiales:
Regex Partidos
\d Dígitos ( más anchos que [0-9] ya que incluyen dígitos persas, indios, etc.)
Sin dígitos ( más corto que [^0-9] desde que rechazó los dígitos persas, los indios,
\D
etc.)
\S Caracteres no en blanco
Clases de negacion
Una careta (^) después del corchete de apertura funciona como una negación de los personajes
que lo siguen. Esto coincidirá con todos los caracteres que no están en la clase de caracteres.
Las clases de caracteres negados también coinciden con los caracteres de salto de línea, por lo
tanto, si estos no deben coincidir, los caracteres de salto de línea específicos deben agregarse a
https://riptutorial.com/es/home 13
la clase (\ r y / o \ n).
Regex Partidos
Examples
Los basicos
Supongamos que tenemos una lista de equipos, llamada así: Team A , Team B , ..., Team Z Entonces:
A menudo necesitamos hacer coincidir los caracteres que "pertenecen" en algún contexto u otro
(como las letras de la A a la Z ), y para eso son las clases de caracteres.
Considere la clase de caracteres [aeiou] . Esta clase de caracteres se puede usar en una
expresión regular para hacer coincidir un conjunto de palabras escritas de manera similar.
b[aeiou]t coincide:
• murciélago
• apuesta
• poco
• larva del moscardón
• pero
No concuerda:
• combate
• btt
• bt
[^0-9a-zA-Z]
Esto coincidirá con todos los caracteres que no sean ni números ni letras (caracteres
alfanuméricos). Si el carácter de subrayado _ también se va a negar, la expresión se puede
https://riptutorial.com/es/home 14
acortar a:
[^\w]
O:
\W
NOTA UNICODE
Tenga en cuenta que algunos tipos con compatibilidad de propiedades de caracteres Unicode
pueden interpretar \w y \W como [\p{L}\p{N}_] y [^\p{L}\p{N}_] que significa otras letras Unicode y
también se incluirán caracteres numéricos (ver documentos PCRE ). Aquí hay una prueba de
PCRE \w :
https://riptutorial.com/es/home 15
Tenga en cuenta que, por alguna razón, Unicode 3.1 letras minúsculas (como ) no
coinciden.
Java (?U)\w coincidirá con una combinación de lo que \w coincide en PCRE y .NET:
[^0-9]
Esto coincidirá con todos los caracteres que no sean dígitos ASCII.
Si también se van a negar los dígitos de Unicode, se puede usar la siguiente expresión,
dependiendo de su configuración de sabor / idioma:
[^\d]
\D
https://riptutorial.com/es/home 16
Es posible que deba habilitar el soporte de propiedades de caracteres Unicode explícitamente
mediante el uso del modificador u o mediante programación en algunos idiomas, pero esto puede
no ser obvio. Para transmitir la intención explícitamente, se puede usar la siguiente construcción
(cuando hay soporte disponible):
\P{N}
Lo que por definición significa: cualquier carácter que no sea un carácter numérico en ningún
script. En un rango de caracteres negados, puedes usar:
[^\p{N}]
1. Clase de personaje
La clase de personaje se denota por [] . El contenido dentro de una clase de caracteres se trata
como un single character separately . por ejemplo, supongamos que usamos
[12345]
• En la clase de caracteres, no hay concepto de hacer coincidir una cadena. Por lo tanto, si
está utilizando regex [cat] , no significa que deba coincidir con la palabra cat literalmente,
sino que debe coincidir con c o a o t . Este es un malentendido muy común que existe entre
las personas que son más nuevas que las expresiones regulares.
• A veces la gente usa | (alternancia) dentro de la clase de personaje pensando que actuará
como OR condition que es incorrecta. por ejemplo, utilizando [a|b] significa en realidad
partido a o | (literalmente) o b .
https://riptutorial.com/es/home 17
encontrar cualquier carácter dentro de los alfabetos en inglés de la A a la Z Esto se puede hacer
usando la siguiente clase de caracteres
[A-Z]
Esto se podría hacer para cualquier rango ASCII o Unicode válido. Los rangos más utilizados
incluyen [AZ] , [az] o [0-9] . Además, estos rangos se pueden combinar en la clase de caracteres
como
[A-Za-z0-9]
• A veces, al escribir rangos para la A a la Z gente lo escribe como [Az] . Esto es incorrecto en
la mayoría de los casos porque estamos usando z lugar de Z Por lo tanto, esto denota una
coincidencia con cualquier carácter del rango ASCII 65 (de A) al 122 (de z), que incluye
muchos caracteres no deseados después del rango ASCII 90 (de Z). SIN EMBARGO , [Az]
se puede usar para hacer coincidir todas las letras [a-zA-Z] en expresiones regulares de
estilo POSIX cuando se establece la intercalación para un idioma en particular. [[
"ABCEDEF[]_abcdef" =~ ([Az]+) ]] && echo "${BASH_REMATCH[1]}" en Cygwin con
LC_COLLATE="en_US.UTF-8" produce ABCEDF . Si establece LC_COLLATE en C (en Cygwin, hecho
con la export ), le dará el ABCEDEF[]_abcdef esperado ABCEDEF[]_abcdef .
La clase de caracteres negados se denota por [^..] . El signo de careta ^ denota coincidir con
cualquier carácter excepto el presente en la clase de carácter. p.ej
[^cat]
https://riptutorial.com/es/home 18
regex, esto da un error. La razón es que cuando está usando ^ en la posición inicial, se
espera que al menos un carácter deba ser negado. Sin embargo, en JavaScript , esta es
una construcción válida que coincide con cualquier cosa pero nada , es decir, coincide con
cualquier símbolo posible (pero con signos diacríticos, al menos en ES5).
Las clases de caracteres POSIX son secuencias predefinidas para un determinado conjunto de
caracteres.
Clase de
Descripción
personaje
[:digit:] Dígitos
https://riptutorial.com/es/home 19
Clase de personaje Descripción
Para utilizar el interior de una secuencia de corchetes (también conocida como clase de
caracteres), también debe incluir los corchetes. Ejemplo:
[[:alpha:]]
[[:digit:]-]{2}
• --
• 11
• -2
• 3-
https://riptutorial.com/es/home 20
Capítulo 5: Combinadores de UTF-8: letras,
marcas, puntuación, etc.
Examples
Cartas a juego en diferentes alfabetos
Los siguientes ejemplos se dan en Ruby, pero los mismos emparejadores deberían estar
disponibles en cualquier idioma moderno.
Digamos que tenemos la cadena "AℵNaïve" , producida por Messy Artificial Intelligence. Se
compone de letras, pero genérica \w matcher no coincidirá tanto:
▶ "AℵNaïve"[/\w+/]
#⇒ "A"
La forma correcta de hacer coincidir la letra Unicode con marcas combinadas es usar \X para
especificar un grupo de grafemas. Sin embargo, hay una advertencia para Ruby. Onigmo, el
motor de expresiones regulares para Ruby, todavía usa la antigua definición de un grupo de
grafemas . Aún no se ha actualizado a Extended Grapheme Cluster como se define en el Anexo
29 de Unicode Standard .
Por lo tanto, para Ruby podríamos tener una solución: \p{L} hará casi bien, salvo porque falla en
el acento diacrítico combinado en i :
▶ "AℵNaïve"[/\p{L}+/]
#⇒ "AℵNai"
Al agregar los "símbolos de marca" a la expresión, finalmente podemos hacer coincidir todo:
▶ "AℵNaïve"[/[\p{L}\p{M}]+/]
#⇒ "AℵNaïve"
https://riptutorial.com/es/home 21
Capítulo 6: Cuando NO debes usar
Expresiones Regulares
Observaciones
Debido a que las expresiones regulares se limitan a una gramática regular o una gramática libre
de contexto, hay muchos usos incorrectos comunes de las expresiones regulares. Entonces, en
este tema hay algunos ejemplos de cuándo NO debe usar expresiones regulares, sino usar su
idioma favorito en su lugar.
Examples
Parejas coincidentes (como paréntesis, paréntesis ...)
Algunos motores de expresiones regulares (como .NET) pueden manejar expresiones sin
contexto, y funcionarán. Pero ese no es el caso para la mayoría de los motores estándar. E
incluso si lo hacen, terminará teniendo una expresión compleja de difícil lectura, mientras que el
uso de una biblioteca de análisis podría facilitar el trabajo.
Debido a que las expresiones regulares pueden hacer mucho, es tentador usarlas para las
operaciones más simples. Pero usar un motor de expresiones regulares tiene un costo en la
memoria y en el uso del procesador: necesita compilar la expresión, almacenar el autómata en la
memoria, inicializarlo y luego alimentarlo con la cadena para ejecutarlo.
¡Y hay muchos casos en los que simplemente no es necesario usarlo! Sea cual sea el idioma que
elija, siempre tiene las herramientas básicas de manipulación de cadenas. Entonces, como regla
general, cuando hay una herramienta para realizar una acción en su biblioteca estándar, use esa
herramienta, no una expresión regular:
'foo.bar'.split('.')
https://riptutorial.com/es/home 22
Es más fácil de leer y entender, y es mucho más eficiente que la expresión regular equivalente
(de alguna manera):
(\w+)\.(\w+)
• ¿Desvío de espacios?
Si desea extraer algo de una página web (o cualquier lenguaje de representación / programación),
una expresión regular es la herramienta incorrecta para la tarea. En su lugar, debe utilizar las
bibliotecas de su idioma para lograr la tarea.
Si desea leer HTML, XML o JSON, simplemente use la biblioteca que lo analiza correctamente y
lo sirve como objetos utilizables en su idioma favorito. Terminarás con un código legible y más
mantenible, y no terminarás
• RegEx coincide con las etiquetas abiertas excepto las etiquetas autocontenidas XHTML
• Python analizando HTML usando expresiones regulares
• ¿Existe una expresión regular para generar todos los enteros para un determinado lenguaje
de programación?
https://riptutorial.com/es/home 23
Capítulo 7: Cuantificadores Posesivos
Observaciones
NB emulando cuantificadores posesivos.
Examples
Uso básico de cuantificadores posesivos
Los cuantificadores posesivos son otra clase de cuantificadores en muchos tipos de expresiones
regulares que permiten que el retroceso se deshabilite, efectivamente, para un token dado. Esto
puede ayudar a mejorar el rendimiento, así como a prevenir coincidencias en ciertos casos.
Cero o mas * *? *+
Uno o mas + +? ++
Cero o uno ? ?? ?+
Considere, por ejemplo, los dos patrones ".*" Y ".*+" , Que operan en la cadena "abc"d . En
ambos casos, el " al principio de la cadena coincide", pero después de eso los dos patrones
tendrán diferentes comportamientos y resultados.
El codificador codicioso luego sorbirá el resto de la cadena, abc"d . Debido a que esto no coincide
con el patrón, entonces retrocederá y caerá la d , dejando el cuantificador que contiene abc" .
Debido a que esto aún no coincide con el patrón, el cuantificador eliminará el " , dejando que
contenga solo abc . Esto coincide con el patrón (ya que " coincide con un literal, en lugar del
cuantificador), y el regex informa de éxito.
Debido a que los cuantificadores posesivos no hacen retroceso, pueden resultar en un aumento
significativo del rendimiento en patrones largos o complejos. Sin embargo, pueden ser peligrosos
(como se ilustra arriba) si uno no es consciente de cómo, precisamente, los cuantificadores
funcionan internamente.
https://riptutorial.com/es/home 24
Capítulo 8: Cuantitativos codiciosos y
perezosos
Parámetros
Cuantificadores Descripción
Cuantificadores
Descripción
perezosos
https://riptutorial.com/es/home 25
Cuantificadores Descripción
Observaciones
Codicia
Un cuantificador codicioso siempre intenta repetir el sub-patrón tantas veces como sea posible
antes de explorar coincidencias más cortas por retroceso.
pereza
Un cuantificador perezoso (también llamado no codicioso o reacio ) siempre intenta repetir el sub-
patrón tan pocas veces como sea posible, antes de explorar coincidencias más largas por
expansión.
Para hacer que los cuantificadores sean perezosos, simplemente agregue ? al cuantificador
existente, por ejemplo, +? , {0,5}? .
Examples
La codicia contra la pereza
https://riptutorial.com/es/home 26
aaaaaAlazyZgreeedyAlaaazyZaaaaa
Usaremos dos patrones: uno codicioso: A.*Z , y uno perezoso: A.*?Z Estos patrones producen las
siguientes coincidencias:
Primero enfócate en lo que A.*Z hace. Cuando coincidió con la primera A , el .* , Siendo codicioso,
luego trata de hacer coincidir tantos . como sea posible.
aaaaaAlazyZgreeedyAlaaazyZaaaaa
\________________________/
A.* matched, Z can't match
Dado que la Z no coincide, el motor retrocede, y .* Debe coincidir con uno menos . :
aaaaaAlazyZgreeedyAlaaazyZaaaaa
\_______________________/
A.* matched, Z can't match
Esto sucede unas cuantas veces más, hasta que finalmente se llega a esto:
aaaaaAlazyZgreeedyAlaaazyZaaaaa
\__________________/
A.* matched, Z can now match
aaaaaAlazyZgreeedyAlaaazyZaaaaa
\___________________/
A.*Z matched
Por el contrario, la repetición reacia (perezosa) en A.*?Z primero coincide con pocas . como sea
posible, y luego tomar más . según sea necesario. Esto explica por qué encuentra dos
coincidencias en la entrada.
Aquí hay una representación visual de lo que los dos patrones combinaron:
aaaaaAlazyZgreeedyAlaaazyZaaaaa
\____/l \______/l l = lazy
\_________g_________/ g = greedy
https://riptutorial.com/es/home 27
Límites con múltiples coincidencias
Cuando tiene una entrada con límites bien definidos y espera más de una coincidencia en su
cadena, tiene dos opciones:
Considera lo siguiente:
Tienes un motor de plantillas simple, quieres reemplazar subcadenas como $[foo] donde foo
puede ser cualquier cadena. Desea reemplazar esta subcadena con lo que esté basado en la
parte entre [] .
Puedes probar algo como \$\[(.*)\] , Y luego usar el primer grupo de captura.
El problema con esto es que si tienes una cadena como something $[foo] lalala $[bar] something
else tu pareja será
1. Uso de la pereza: en este caso, hacer * perezoso es una forma de encontrar las cosas
correctas. Así que cambias tu expresión a \$\[(.*?)\]
El uso de la clase de caracteres negados reduce el problema del seguimiento y puede ahorrarle
mucho tiempo a la CPU cuando se trata de entradas grandes.
https://riptutorial.com/es/home 28
Capítulo 9: Escapando
Examples
Literales crudos de cuerda
Es mejor para la legibilidad (y su cordura) para evitar escapar de los escapes. Ahí es donde
entran en juego los literales de cadenas en bruto. (Tenga en cuenta que algunos idiomas
permiten delimitadores, que generalmente se prefieren a las cadenas. Pero esa es otra sección).
[A] barra invertida, \ , se toma como que significa "solo una barra invertida" (excepto
cuando aparece justo antes de una cita que de otra manera terminaría el literal) - no
hay "secuencias de escape" para representar nuevas líneas, tabulaciones, espacios
en blanco, feeds de formularios , y así.
No todos los idiomas los tienen, y los que usan una sintaxis variable. C # en realidad los llama
literales de cadena literal , pero es lo mismo.
Pitón
pattern = r"regex"
pattern = r'regex'
C ++ (11+)
La sintaxis aquí es extremadamente versátil. La única regla es usar un delimitador que no
aparezca en ninguna parte de la expresión regular. Si lo hace, no es necesario que escape más
para nada en la cadena. Tenga en cuenta que los paréntesis () no forman parte de la expresión
regular:
pattern = R"delimiter(regex)delimiter";
VB.NET
Solo usa una cuerda normal. Las barras invertidas son siempre literales .
https://riptutorial.com/es/home 29
DO#
pattern = @"regex";
Tenga en cuenta que esta sintaxis también permite "" (dos comillas dobles) como una forma de
escape de " .
Instrumentos de cuerda
En la mayoría de los lenguajes de programación, para tener una barra invertida en una cadena
generada a partir de una cadena literal, cada barra invertida debe duplicarse en la cadena literal.
De lo contrario, se interpretará como un escape para el siguiente personaje.
Desafortunadamente, cualquier barra invertida requerida por la expresión regular debe ser una
barra invertida literal. Es por esto que se hace necesario tener "escapes de escape" ( \\ ) cuando
las expresiones regulares se generan a partir de literales de cadena.
Además, las comillas ( " o ' ) en el literal de cadena pueden ser eliminadas, dependiendo de lo
que rodee al literal de cadena. En algunos idiomas, es posible usar cualquiera de los estilos de
comillas para una cadena (elija el más legible para escapando de toda la cadena literal).
En algunos idiomas (por ejemplo, Java <= 7), las expresiones regulares no se pueden expresar
directamente como literales como /\w/ ; deben generarse a partir de cadenas, y normalmente se
utilizan literales de cadena, en este caso, "\\w" . En estos casos, los caracteres literales, como
comillas, barras invertidas, etc., deben escaparse. La forma más fácil de lograr esto puede ser
usando una herramienta (como RegexPlanet ). Esta herramienta específica está diseñada para
Java, pero funcionará para cualquier idioma con una sintaxis de cadena similar.
Barras invertidas
Decir que la barra invertida es el carácter de "escape" es un poco confuso. La barra invertida se
escapa y la barra invertida trae; en realidad, activa o desactiva el metacarácter frente al estado
literal del personaje que se encuentra frente a él.
Para utilizar una barra invertida literal en cualquier parte de una expresión regular, debe ser
escapada por otra barra invertida.
https://riptutorial.com/es/home 30
Hay varios personajes que necesitan ser escapados para ser tomados literalmente (al menos
fuera de las clases char):
• Soportes: []
• Paréntesis: ()
• Aparatos ortopédicos: {}
• Operadores: * , + ? , |
• Anclajes: ^ , $
• Otros: . , \
• Para utilizar un literal ^ al inicio o un $ literal al final de una expresión regular, el carácter
debe ser escapado.
• Algunos sabores solo usan ^ y $ como metacaracteres cuando están al principio o al final de
la expresión regular, respectivamente. En esos sabores, ningún escape adicional es
necesario. Por lo general, es mejor escapar de todos modos.
Escapar de la sustitución
También hay reglas para escapar dentro del reemplazo, pero ninguna de las reglas anteriores se
aplican. Los únicos metacaracteres son $ y \ , al menos cuando $ se puede usar para hacer
referencia a grupos de captura (como $1 para el grupo 1). Para usar un $ literal, escápalo: \$5.00 .
Del mismo modo \ : C:\\Program Files\\ .
Excepciones BRE
Mientras que ERE (expresiones regulares extendidas) refleja la sintaxis típica de estilo Perl, BRE
(expresiones regulares básicas) tiene diferencias significativas cuando se trata de escapar:
• Hay diferentes sintaxis abreviada. Todos los \d , \s , \w y así sucesivamente se han ido. En
su lugar, tiene su propia sintaxis (que POSIX confusamente llama "clases de caracteres"),
como [:digit:] . Estas construcciones deben estar dentro de una clase de caracteres.
• Hay pocos metacaracteres ( . , * , ^ , $ ) Que se pueden usar normalmente. TODOS los
otros metacaracteres deben escaparse de manera diferente:
Llaves {}
https://riptutorial.com/es/home 31
• a{1,2} coincide con a{1,2} . Para hacer coincidir a o aa , use a\{1,2\}
Paréntesis ()
• (ab)\1 no es válido, ya que no hay un grupo de captura 1. Para solucionarlo y hacer coincidir
abab use \(ab\)\1
Barra invertida
Otro
• + y ? son literales. Si el motor BRE los admite como metacaracteres, deben escaparse como
\? y \+ .
/ Delimitadores /
Muchos idiomas permiten que las expresiones regulares se incluyan o delimiten entre un par de
caracteres específicos, generalmente la barra diagonal hacia adelante / .
La fuga excesiva perjudica la legibilidad, por lo que es importante considerar las opciones
disponibles:
Javascript es único porque permite la barra inclinada como un delimitador, pero nada más
(aunque sí permite expresiones regulares de cadena ).
Perl 1
Perl, por ejemplo, permite que casi cualquier cosa sea un delimitador. Incluso los caracteres
árabes:
$str =~ m ش ش
https://riptutorial.com/es/home 32
Lea Escapando en línea: https://riptutorial.com/es/regex/topic/4524/escapando
https://riptutorial.com/es/home 33
Capítulo 10: Grupos de captura
Examples
Grupos de captura básicos
Un grupo es una sección de una expresión regular entre paréntesis () . Esto se denomina
comúnmente "subexpresión" y tiene dos propósitos:
• Hace que la subexpresión sea atómica, es decir, que coincida, falle o se repita como un
todo.
• La parte del texto que coincidió es accesible en el resto de la expresión y el resto del
programa.
Los grupos están numerados en los motores de expresiones regulares, comenzando con 1.
Tradicionalmente, el número máximo de grupos es 9, pero muchos de los sabores de expresiones
regulares modernas admiten un mayor número de grupos. El grupo 0 siempre coincide con todo
el patrón, de la misma manera que rodea toda la expresión regular con corchetes.
El número ordinal aumenta con cada paréntesis de apertura, independientemente de si los grupos
se colocan uno tras otro o anidados:
foo(bar(baz)?) (qux)+|(bla)
1 2 3 4
Después de que una expresión logre una coincidencia global, todos sus grupos estarán en uso,
ya sea que un grupo en particular haya logrado igualar algo o no.
Un grupo puede ser opcional, como (baz)? arriba, o en una parte alternativa de la expresión que
no se usó de la coincidencia, como (bla) arriba. En estos casos, los grupos no coincidentes
simplemente no contendrán ninguna información.
Si desea recuperar la fecha y el nivel de error de una entrada de registro como esta:
https://riptutorial.com/es/home 34
^(\d{4}-\d{2}-\d{2}) \d{2}:\d{2}.\d{3} (\w*): .*$
Esto extraería la fecha de la entrada de registro 2012-06-06 como grupo de captura 1 y el nivel de
error ERROR como grupo de captura 2.
Dado que los grupos están "numerados", algunos motores también admiten la coincidencia con lo
que un grupo ha vuelto a hacer coincidir previamente.
Suponiendo que quisiera hacer coincidir algo donde dos cuerdas iguales de la longitud tres se
dividen por un $ que usaría:
(.{3})\$\1
"abc$abc"
"a b$a b"
"af $af "
" $ "
Si desea que un grupo no esté numerado por el motor, puede declararlo como no capturado. Un
grupo que no captura se ve así:
(?:)
Son particularmente útiles para repetir un cierto patrón cualquier cantidad de veces, ya que un
grupo también puede usarse como un "átomo". Considerar:
Esto coincidirá con dos entradas de registro en las líneas adyacentes que tienen la misma marca
de tiempo y la misma entrada.
Algunos sabores de expresiones regulares permiten grupos de captura con nombre . En lugar de
hacerlo mediante un índice numérico, puede referirse a estos grupos por su nombre en el código
posterior, es decir, en las referencias inversas, en el patrón de reemplazo y en las siguientes
líneas del programa.
Los índices numéricos cambian a medida que cambia el número o la disposición de los grupos en
una expresión, por lo que son más frágiles en comparación.
Por ejemplo, para hacer coincidir una palabra ( \w+ ) entre comillas simples o dobles ( ['"] ),
podríamos usar:
https://riptutorial.com/es/home 35
(?<quote>['"])\w+\k{quote}
Lo que equivale a:
(['"])\w+\1
En una situación simple como esta, un grupo de captura numerado y regular no tiene ningún
inconveniente.
En situaciones más complejas, el uso de grupos con nombre hará que la estructura de la
expresión sea más evidente para el lector, lo que mejora la capacidad de mantenimiento.
El análisis de archivos de registro es un ejemplo de una situación más compleja que se beneficia
de los nombres de grupo. Este es el formato de registro común de Apache (CLF):
• (?<name>...)
• (?'name'...)
• (?P<name>...)
Backreferences:
• \k<name>
• \k{name}
• \k'name'
• \g{name}
• (?P=name)
En la versión .NET, puede tener varios grupos compartiendo el mismo nombre, usarán pilas de
captura .
(?J)(?<a>...)(?<a>...)
(?|(?<a>...)|(?<a>...))
https://riptutorial.com/es/home 36
Capítulo 11: Grupos de captura con nombre
Sintaxis
• Cree un grupo de captura con nombre (siendo X el patrón que desea capturar):
(? 'nombre'X) (? X) (? PX)
Observaciones
Python y Java no permiten que múltiples grupos usen el mismo nombre.
Examples
Cómo se ve un grupo de captura con nombre
Dados los sabores, el grupo de captura nombrado puede tener este aspecto:
(?'name'X)
(?<name>X)
(?P<name>X)
En el que quiero capturar el tema (en cursiva) de cada línea. Usaré la siguiente expresión .* was
a (?<subject>[\w ]+)[.]{3} .
MATCH 1
subject [29-47] `pretty little girl`
MATCH 2
subject [80-99] `unicorn with an hat`
MATCH 3
subject [132-155] `boat with a pirate flag`
https://riptutorial.com/es/home 37
Como puede (o no) saber, puede hacer referencia a un grupo de captura con:
$1
1 es el número de grupo.
${name}
\{name}
g\{name}
https://riptutorial.com/es/home 38
Capítulo 12: Límite de palabra
Sintaxis
• Estilo POSIX, final de la palabra: [[:>:]]
• Estilo POSIX, comienzo de palabra: [[:<:]]
• Estilo POSIX, límite de palabra: [[:<:][:>:]]
• SVR4 / GNU, fin de la palabra: \>
• SVR4 / GNU, comienzo de la palabra: \<
• Perl / GNU, límite de palabra: \b
• Tcl, fin de la palabra: \M
• Tcl, comienzo de la palabra: \m
• Tcl, límite de palabra: \y
• ERE portátil, comienzo de la palabra: (^|[^[:alnum:]_])
• ERE portátil, final de la palabra: ([^[:alnum:]_]|$)
Observaciones
Recursos adicionales
• Capítulo POSIX sobre expresiones regulares.
• Perl documentación de expresiones regulares
• Tcl re_syntax manual de la página
• Expresiones de barra invertida grep de GNU
• BSD re_format
• Más lectura
Examples
Coincidir palabra completa
\bfoo\b
Tomando de regularexpression.info
https://riptutorial.com/es/home 39
no es un carácter de palabra.
1. Alfabeto ( [a-zA-Z] )
2. Número ( [0-9] )
3. Subrayar _
foobarfoo
bar
foobar
barfoo
Límites de palabras
El metacarácter \b
Para que sea más fácil encontrar palabras completas, podemos usar el metacarácter \b . Marca el
comienzo y el final de una secuencia alfanumérica *. Además, como solo sirve para marcar
estas ubicaciones, en realidad no coincide con ningún personaje por sí solo.
*: Es común llamar palabra a una secuencia alfanumérica, ya que podemos capturar sus
caracteres con una \w (la clase de caracteres de la palabra). Sin embargo, esto puede ser
engañoso, ya que \w también incluye números y, en la mayoría de los casos, el guión bajo.
Ejemplos:
Regex Entrada ¿Partidos?
\bstack\b foo stack bar Sí , ya que no hay nada antes ni después de la stack
https://riptutorial.com/es/home 40
Regex Entrada ¿Partidos?
El metacarácter \B
Esto es lo opuesto a \b , que coincide con la ubicación de cada carácter no delimitador. Me gusta
\b , ya que coincide con ubicaciones, no coincide con ningún personaje por sí solo. Es útil para
encontrar palabras no completas.
Ejemplos:
Regex Entrada ¿Partidos?
Para hacer que el texto largo tenga un máximo de N caracteres pero deje la última palabra
intacta, use el patrón .{0,N}\b :
^(.{0,N})\b.*
https://riptutorial.com/es/home 41
Capítulo 13: Lookahead y Lookbehind
Sintaxis
• Lookahead positivo: (?=pattern)
• Lookahead negativo: (?!pattern)
• Mirada positiva detrás de : (?<=pattern)
• Mirada negativa detrás de : (?<!pattern)
Observaciones
No es compatible con todos los motores de expresiones regulares.
Además, muchos motores de expresiones regulares limitan los patrones en el interior de las
cuerdas de longitud fija. Por ejemplo, el patrón (?<=a+)b debe coincidir con la b en aaab pero arroja
un error en Python.
Los grupos de captura están permitidos y funcionan como se espera, incluidas las referencias
inversas. Sin embargo, el lookahead / lookbehind no es un grupo de captura.
Examples
Lo esencial
Un lookahead positivo (?=123) afirma que el texto es seguido por el patrón dado, sin incluir el
patrón en la coincidencia. De manera similar, una mirada positiva detrás de (?<=123) afirma que
el texto está precedido por el patrón dado. Sustituyendo el = con ! Niega la afirmación.
Entrada : 123456
Entrada : 456
• 123(?=456) falla
• (?<=123)456 falla
• 123(?!456) falla
• (?<!123)456 partidos 456
https://riptutorial.com/es/home 42
Se puede usar una mirada detrás del final de un patrón para asegurar que termine o no de cierta
manera.
([az ]+|[AZ ]+)(?<! )coincide con secuencias de solo letras en minúsculas o mayúsculas,
excluyendo los espacios en blanco finales.
Algunos sabores de expresiones regulares (Perl, PCRE, Oniguruma, Boost) solo son compatibles
con el aspecto de longitud fija, pero ofrecen la función \K , que se puede usar para simular el
aspecto de longitud variable al inicio de un patrón. Al encontrar un \K , el texto coincidente hasta
este punto se descarta, y solo el texto que coincide con la parte del patrón que sigue a \K se
mantiene en el resultado final.
ab+\Kc
Es equivalente a:
(?<=ab+)c
(subpattern A)\K(subpattern B)
(?<=subpattern A)(subpattern B)
Excepto cuando el subpatrón B puede coincidir con el mismo texto que el subpatrón A, podría
terminar con resultados sutilmente diferentes, porque el subpatrón A todavía consume el texto, a
diferencia de lo que se ve por detrás.
https://riptutorial.com/es/home 43
Capítulo 14: Modificadores de expresiones
regulares (banderas)
Introducción
Los patrones de expresión regular a menudo se usan con modificadores (también llamados
indicadores ) que redefinen el comportamiento de expresiones regulares. Los modificadores
Regex pueden ser regulares (por ejemplo, /abc/i ) y en línea (o incrustados ) (por ejemplo,
(?i)abc ). Los modificadores más comunes son los modificadores globales, que no distinguen
entre mayúsculas y minúsculas, multilínea y dotall. Sin embargo, los tipos de expresión regular
difieren en el número de modificadores de expresión regular admitidos y sus tipos.
Observaciones
Modificadores PCRE
En
Modificador Descripción
línea
https://riptutorial.com/es/home 44
Modificadores de Java
Modificador ( Pattern.### ) Valor Descripción
Examples
Modificador DOTALL
Un patrón de expresiones regulares donde un modificador DOTALL (en la mayoría de los sabores
de expresiones regulares expresado con s ) cambia el comportamiento de . habilitándolo para
que coincida con un símbolo de nueva línea (LF):
Esta expresión regular al estilo de Perl coincidirá con una cadena como "cat fled from\na dog"
capturando "fled from\na" al Grupo 1.
Nota : JavaScript no proporciona un modificador DOTALL, por lo que a . nunca se puede permitir
https://riptutorial.com/es/home 45
que coincida con un carácter de nueva línea. Para lograr el mismo efecto, una solución es
necesaria, por ejemplo, sustituyendo todos los . s con una clase de caracteres comodín como
[\S\s] , o una clase de carácter no nada [^] (sin embargo, esta construcción será tratada como
un error por todos los otros motores, y por lo tanto no es portátil).
Modificador MULTILINE
encontrará todas las líneas que comienzan con My Line , luego contendrá un espacio y 1+ dígitos
hasta el final de la línea.
NOTA : En Oniguruma (por ejemplo, en Ruby), y también en casi todos los editores de texto que
admiten expresiones regulares, los anclajes ^ y $ indican las posiciones de inicio / final de línea de
forma predeterminada . Debe usar \A para definir todo el comienzo de cadena / documento y \z
para denotar el final de cadena / documento. La diferencia entre \Z y \z es que la primera puede
coincidir antes del símbolo de nueva línea final (LF) al final de la cadena (por ejemplo,
/\Astring\Z/ encontrará una coincidencia en "string\n" ) (excepto Python, donde el
comportamiento de \Z es igual a \z no se admite el anclaje \z ).
/fog/i
Notas:
https://riptutorial.com/es/home 46
VERBOSE / COMMENT / IgnorePatternWhitespace modifier
El modificador que permite usar espacios en blanco dentro de algunas partes del patrón para
formatearlo para una mejor legibilidad y para permitir comentarios que comiencen con # :
Ejemplo de una cadena: #word1here . Tenga en cuenta que el símbolo # se escapa para denotar
un # literal que forma parte de un patrón.
Generalmente, el espacio en blanco dentro de las clases de caracteres ( [...] ) se trata como un
espacio en blanco literal, excepto en Java.
Además, vale la pena mencionar que en PCRE, .NET, Python, Ruby Oniguruma, ICU, Boost
regex, los sabores se pueden usar (?#:...) dentro del patrón regex.
(?n)(\d+)-(\w+)-(?<id>\w+)
coincidirá con todo 123-1_abc-00098 , pero (\d+) y (\w+) no crearán grupos en el objeto coincidente
resultante. El único grupo será ${id} . Ver demo .
Modificador UNICODE
El modificador UNICODE, generalmente expresado como u (PHP, Python) o U (Java), hace que el
motor de expresiones regulares trate el patrón y la cadena de entrada como cadenas y patrones
de Unicode, hace que las clases abreviadas del patrón como \w , \d , \s , etc. Unicode-
conscientes.
/\A\p{L}+\z/u
es una expresión regular de PHP para hacer coincidir cadenas que constan de 1 o más letras
Unicode. Ver la demo regex .
Tenga en cuenta que en PHP , el modificador /u permite al motor PCRE manejar cadenas como
https://riptutorial.com/es/home 47
UTF8 (activando el verbo PCRE_UTF8 ) y hacer que las clases de caracteres abreviadas en el patrón
Unicode sean conscientes (al habilitar el verbo PCRE_UCP , consulte más en pcre.org ) .
Los patrones y las cadenas de sujetos se tratan como UTF-8. Este modificador
está disponible desde PHP 4.1.0 o superior en Unix y desde PHP 4.2.3 en win32. La
validez UTF-8 del patrón y del sujeto se verifica desde PHP 4.3.5. Un sujeto no válido
hará que la función preg_ * no coincida con nada; un patrón no válido activará un error
de nivel E_WARNING. Las secuencias de UTF-8 de cinco y seis octetos se consideran
inválidas desde PHP 5.3.4 (resp. PCRE 7.3 2007-08-28); anteriormente aquellos han
sido considerados como válidos UTF-8.
System.out.println("Dąb".matches("(?U)\\w+")); // true
System.out.println("Dąb".matches("\\w+")); // false
PCRE_DOLLAR_ENDONLY modificador
/^\d+$/D
es igual a
/^\d+\z/
y coincide con una cadena completa que consta de 1 o más dígitos y no coincidirá con "123\n" ,
pero coincidirá con "123" .
Modificador PCRE_ANCHORED
Otro modificador compatible con PCRE expresado con /A modificador. Si se establece este
modificador, el patrón se obliga a "anclarse", es decir, se limita a coincidir solo al comienzo de la
cadena que se está buscando (la "cadena de asunto"). Este efecto también puede lograrse
mediante construcciones apropiadas en el propio patrón, que es la única forma de hacerlo en
Perl.
/man/A
es lo mismo que
https://riptutorial.com/es/home 48
/^man/
Modificador PCRE_UNGREEDY
Modificador PCRE_INFO_JCHANGED
NOTA : solo se admite la versión en línea - (?J) , y se debe colocar al inicio del patrón.
Si utiliza
/(?J)\w+-(?:new-(?<val>\w+)|\d+-empty-(?<val>[^-]+)-collection)/
los valores de grupo "val" nunca estarán vacíos (siempre se establecerán). Sin embargo, se
puede lograr un efecto similar con el reinicio de rama.
Modificador PCRE_EXTRA
Un modificador de PCRE que causa un error si una barra invertida en un patrón es seguida por
una letra que no tiene un significado especial. De forma predeterminada, una barra invertida
seguida de una letra sin un significado especial se trata como un literal.
P.ej
/big\y/
/big\y/X
https://riptutorial.com/es/home 49
Capítulo 15: Patrones simples a juego
Examples
Haga coincidir un carácter de un solo dígito usando [0-9] o \ d (Java)
[0-9] y \d son patrones equivalentes (a menos que su motor Regex sea compatible con Unicode y
\d también coincida con cosas como). Ambos coincidirán con un carácter de un solo dígito para
que pueda usar la notación que encuentre más legible.
Crea una cadena del patrón que deseas hacer coincidir. Si usa la notación \ d, deberá agregar
una segunda barra diagonal inversa para escapar de la primera barra diagonal inversa.
Pattern p = Pattern.compile(pattern);
Crea un objeto Matcher. Pase la cadena que está buscando para encontrar el patrón en el
método matcher (). Compruebe si se encuentra el patrón.
Matcher m1 = p.matcher("0");
m1.matches(); //will return true
Matcher m2 = p.matcher("5");
m2.matches(); //will return true
Matcher m3 = p.matcher("12345");
m3.matches(); //will return false since your pattern is only for a single integer
https://riptutorial.com/es/home 50
[3-7][3-7] will match 2 consecutive digits that are in the range 3 to 7
[3-7]+ will match 1 or more consecutive digits that are in the range 3 to 7
[3-7]* will match 0 or more consecutive digits that are in the range 3 to 7
[3-7]{3} will match 3 consecutive digits that are in the range 3 to 7
[3-7]{3,6} will match 3 to 6 consecutive digits that are in the range 3 to 7
[3-7]{3,} will match 3 or more consecutive digits that are in the range 3 to 7
números coincidentes que se dividen por 4: cualquier número que sea 0, 4 u 8 o que finalice en
00, 04, 08, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60 64, 68, 72, 76, 80, 84, 88, 92 o 96
[048]|\d*(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)
Esto se puede acortar. Por ejemplo, en lugar de usar 20|24|28 podemos usar 2[048] . Además,
como los años 40, 60 y 80 tienen el mismo patrón, podemos incluirlos: [02468][048] y los otros
también tienen un patrón [13579][26] . Entonces toda la secuencia puede reducirse a:
Los números coincidentes que no tienen un patrón como los divisibles por 2,4,5,10, etc. no
siempre se pueden hacer de manera sucinta y, por lo general, hay que recurrir a un rango de
números. Por ejemplo, hacer coincidir todos los números que se dividen por 7 dentro del rango de
1 a 50 se puede hacer de manera simple al enumerar todos esos números:
7|14|21|28|35|42|49
7|14|2[18]|35|4[29]
https://riptutorial.com/es/home 51
Espacios finales
\s*$ : Esto coincidirá con cualquier ( * ) espacio en blanco ( \s ) al final ( $ ) del texto
Espacios principales
^\s* : Esto coincidirá con cualquier ( * ) espacio en blanco ( \s ) al principio ( ^ ) del texto
Observaciones
\ses un metacarácter común para varios motores RegExp, y está destinado a capturar caracteres
de espacios en blanco (espacios, nuevas líneas y pestañas, por ejemplo). Nota : probablemente
no capturará todos los caracteres de espacio Unicode . Revise la documentación de su motor
para estar seguro de esto.
[\+\-]?\d+(\.\d*)?
Esto coincidirá con cualquier flotante firmado, si no quiere signos o está analizando una ecuación,
elimine [\+\-]? entonces tienes \d+(\.\d+)?
Explicación:
5
+5
-5
5.5
+5.5
-5.5
1. Alon Cohen
https://riptutorial.com/es/home 52
2. Elad Yaron
3. Yaron Amrani
4. Yogev Yaron
Ya que no me importa qué número es, solo lo pondré como el dígito que sea y el punto y el
espacio que le siguen desde el principio de la línea, como este: ^[\d]+\.\s .
Ahora tendremos que coincidir con el espacio y el primer nombre, ya que no podemos saber si es
mayúscula o minúscula, solo coincidiremos con ambos: [a-zA-Z]+\s o [aZ]+\s y también puede ser
[\w]+\s .
Ahora especificaremos el apellido requerido para obtener solo las líneas que contienen Yaron
como apellido (al final de la línea): \sYaron$ .
https://riptutorial.com/es/home 53
Capítulo 16: Personajes ancla: Caret (^)
Observaciones
Terminología
• sombrero
• controlar
• estrecho
• cheurón
• acento circunflejo
Uso
Escape de personajes
Para expresar un cursor sin un significado especial, debe escaparse precediéndolo con una barra
invertida; es decir \^ .
Examples
Comienzo de linea
^He
https://riptutorial.com/es/home 54
• First line\nHedgehog\nLast line
• IHedgehog
• Hedgehog (por espacios en blanco )
^He
Lo anterior coincidiría con cualquier cadena de entrada que contenga una línea que comience con
He .
• Hello
• First line\nHedgehog\nLast line (solo segunda línea)
• My\nText\nIs\nHere (solo la última línea)
Para hacer coincidir una línea vacía (línea múltiple en ), se utiliza un símbolo de intercalación
junto a $ que es otro carácter de ancla que representa la posición al final de la línea ( Caracteres
de Ancla: Dólar ($) ). Por lo tanto, la siguiente expresión regular coincidirá con una línea vacía:
^$
[12^3]
https://riptutorial.com/es/home 55
[\^123]
Si quieres hacer coincidir el personaje de caret en sí mismo fuera de una clase de personaje,
necesitas escapar de él:
\^
Esto evita que ^ se interprete como el carácter de anclaje que representa el comienzo de la
cadena / línea.
Si bien muchas personas piensan que ^ significa el inicio de una cadena, en realidad significa el
inicio de una línea. Para un inicio real de uso de anclaje de cadena, \A
hello
world
Modificador multilínea
Por defecto, caret ^ metacharacter coincide con la posición antes del primer carácter en la
cadena.
Dada la cadena " charsequence " aplicada contra los siguientes patrones: /^char/ & /^sequence/ ,
el motor intentará coincidir de la siguiente manera:
• /^char/
○ ^ - charsequence
○ c - c harsequence
○ h - ch arsequence
○ a - cha rsequence
○ r - char secuencia
Coincidencia encontrada
• /^sequence/
○ ^ - charsequence
○ s - charsequence
Partido no encontrado
https://riptutorial.com/es/home 56
Por ejemplo:
/^/g
\Char \ r \ n
\r\n
secuencia
Sin embargo, si necesita hacer coincidir después de cada terminador de línea, tendrá que
establecer el modo multilínea ( //m , (?m) ) dentro de su patrón. Al hacerlo, el carácter de
intercalación ^ coincidirá con "el comienzo de cada línea", que corresponde a la posición al
comienzo de la cadena y las posiciones inmediatamente después de 1 los terminadores de
línea.
1 En algunos tipos (Java, PCRE, ...), ^ no coincidirá después del terminador de línea, si el terminador de línea es el
último de la cadena.
Por ejemplo:
/^/gm
\Char \ r \ n
┊\r\n
┊secuencia
• Java
• .RED
• PCRE
/(?m)^abc/
/^abc/m
abc_regex = re.compile("(?m)^abc");
abc_regex = re.compile("^abc", re.MULTILINE);
https://riptutorial.com/es/home 57
Capítulo 17: Recursion
Observaciones
La recursión está disponible principalmente en sabores compatibles con Perl, tales como:
• Perl
• PCRE
• Oniguruma
• Aumentar
Examples
Repetir todo el patrón
<(?>[^<>]+|(?R))+>
Esto hará coincidir los corchetes angulares correctamente equilibrados con cualquier texto entre
los corchetes, como <a<b>c<d>e> .
Reclamar en un subpatrón
Puede recurrir a un subpatrón usando las siguientes construcciones (según el tipo), asumiendo
que n es un número de grupo de captura y name el nombre de un grupo de captura.
• (?n)
• \g<n>
• \g'0'
• (?&name)
• \g<name>
• \g'name'
• (?P>name)
El siguiente patrón:
\[(?<angle><(?&angle)*+>)*\]
Coincidirá con el texto como: [<<><>><>] - corchetes angulares bien equilibrados entre corchetes.
La recursión se utiliza a menudo para la construcción equilibrada de construcciones.
Definiciones de subpattern
La construcción (?(DEFINE) ... ) permite definir subpatrones a los que puede hacer referencia más
adelante mediante recursión. Cuando se encuentre en el patrón, no se comparará con.
https://riptutorial.com/es/home 58
Este grupo debe contener definiciones de subpatrones con nombre, a las que solo se podrá
acceder mediante recursión. Puedes definir las gramáticas de esta manera:
Observe cómo una lista puede contener uno o más valores, y un valor puede ser una lista.
En PCRE, los grupos emparejados utilizados para las referencias inversas antes de una recursión
se mantienen en la recursión. Pero después de la recursión, todos se restablecen a lo que eran
antes de entrar. En otras palabras, los grupos emparejados en la recursión son todos olvidados.
Por ejemplo:
(?J)(?(DEFINE)(\g{a}(?<a>b)\g{a}))(?<a>a)\g{a}(?1)\g{a}
partidos
aaabba
En PCRE, no hace un trackback después de que se encuentra la primera coincidencia para una
https://riptutorial.com/es/home 59
recursión. Asi que
(?(DEFINE)(aaa|aa|a))(?1)ab
no coincide
aab
porque después de coincidir con aa en la recursión, nunca volverá a intentar coincidir con solo a .
https://riptutorial.com/es/home 60
Capítulo 18: Referencia posterior
Examples
Lo esencial
Las referencias anteriores se utilizan para hacer coincidir el mismo texto que un grupo de captura
coincidió previamente. Esto ayuda tanto a reutilizar partes anteriores de su patrón como a
asegurar que dos partes de una cadena coinciden.
Por ejemplo, si está intentando verificar que una cadena tiene un dígito de cero a nueve, un
separador, como guiones, barras o incluso espacios, una letra minúscula, otro separador, luego
otro dígito de cero a nueve, podría use un regex como este:
Esto coincidiría con 1-a-4 , pero también coincidiría con 1-a/4 o 1 a-4 . Si queremos que los
separadores coincidan, podemos usar un grupo de captura y una referencia posterior. La
referencia posterior verá la coincidencia encontrada en el grupo de captura indicado y asegurará
que la ubicación de la referencia posterior coincida exactamente.
[0-9]([-/ ])[a-z]\1[0-9]
El \1 denota el primer grupo de captura en el patrón. Con este pequeño cambio, la expresión
regular ahora combina 1-a-4 o 1 a 4 pero no 1 a-4 o 1-a/4 .
Los grupos de captura anidados cambian este conteo ligeramente. Primero cuenta el grupo de
captura exterior, luego el siguiente nivel y continúa hasta que abandonas el nido:
(([0-9])([-/ ]))([a-z])
|--2--||--3--|
|-------1------||--4--|
Referencias ambiguas
1-a-0
https://riptutorial.com/es/home 61
6/p/0
4 g 0
Solución ingenua: adaptando la expresión regular del ejemplo de Conceptos básicos , puede
encontrar esta expresión regular:
[0-9]([-/ ])[a-z]\10
Pero eso probablemente no funcionará. La mayoría de los tipos de expresiones regulares admiten
más de nueve grupos de captura, y muy pocos de ellos son lo suficientemente inteligentes como
para darse cuenta de que, dado que solo hay un grupo de captura, \10 debe ser una referencia
inversa al grupo 1 seguido de un 0 literal. La mayoría de los sabores lo tratarán como una
referencia inversa al grupo 10. Algunos de ellos lanzarán una excepción porque no hay un grupo
10; el resto simplemente no coincidirá.
Hay varias formas de evitar este problema. Una es usar grupos con nombre (y referencias con
nombre):
[0-9](?<sep>[-/ ])[a-z]\k<sep>0
[0-9]([-/ ])[a-z]\g{1}0
Otra forma es usar el formato de expresiones regulares extendido, separando los elementos con
espacios en blanco insignificantes (en Java, tendrá que escapar del espacio entre paréntesis):
[0-9]([-/ ])[a-z](?:\1)0
... o un cuantificador ficticio (esta es posiblemente la única circunstancia en la que {1} es útil):
[0-9]([-/ ])[a-z]\1{1}0
https://riptutorial.com/es/home 62
Capítulo 19: Restablecer partido: \ K
Observaciones
Regex101 define la funcionalidad \ K como:
• .RED
• awk
• golpetazo
• ÑU
• UCI
• Java
• Javascript
• Bloc de notas ++
• C objetivo
• POSIX
• Pitón
• Qt / QRegExp
• sed
• Tcl
• empuje
• XML
• XPath
Examples
Buscar y reemplazar utilizando el operador \ K
Dado el texto:
https://riptutorial.com/es/home 63
foo: bar
Me gustaría reemplazar cualquier cosa después de "foo:" con "baz", pero quiero mantener "foo:".
Esto se podría hacer con un grupo de captura como este:
s/(foo: ).*/$1baz/
foo: baz
Ejemplo 1
o podríamos usar \K , que "olvida" todo lo que ha igualado previamente, con un patrón como este:
s/foo: \K.*/baz/
La expresión regular coincide con "foo:" y luego se encuentra con la \K , los caracteres
coincidentes previamente se dan por sentados y la expresión regular los deja, lo que significa que
solo la cadena que coincide con .* Se reemplazará por "baz", lo que da como resultado el texto:
foo: baz
Ejemplo 2
https://riptutorial.com/es/home 64
Capítulo 20: Retroceso
Examples
¿Qué causa el Backtracking?
Para encontrar una coincidencia, el motor de expresiones regulares consumirá caracteres uno por
uno. Cuando comienza una coincidencia parcial, el motor recordará la posición de inicio para que
pueda retroceder en caso de que los siguientes caracteres no completen la coincidencia.
abc123def
^ Does not match \d
abc123def
^ Does not match \d
abc123def
^ Does not match \d
abc123def
^ Does match \d (first one)
abc123def
^ Does match \d (second one)
abc123def
^ Does match \d (third one)
abc123def
^ Does match [a-z] (first one)
abc123def
^ Does match [a-z] (second one)
MATCH FOUND
abc123def
^ Does not match \d
abc123def
^ Does not match \d
abc123def
^ Does not match \d
abc123def
^ Does match \d (first one)
abc123def
^ Does match \d (second one)
abc123def
^ Does not match [a-z]
abc123def
^ BACKTRACK to catch \d{2} => (23)
abc123def
^ Does match [a-z] (first one)
abc123def
https://riptutorial.com/es/home 65
^ Does match [a-z] (second one)
MATCH FOUND
Por supuesto, (aa*)+b parece un error de novato, pero está aquí para ilustrar el punto y, a veces,
terminará con el mismo problema pero con patrones más complicados.
Un caso más extremo de retroceso catastrófico ocurre con la expresión regular (x+x+)+y
(probablemente lo haya visto antes aquí y aquí ), que necesita un tiempo exponencial para
descubrir que una cadena que contiene x s y nada más (por ejemplo, xxxxxxxxxxxxxxxxxxxx ) no
coinciden.
¿Cómo evitarlo?
Sea lo más específico posible, reduzca lo más posible los caminos posibles. Tenga en cuenta que
algunos comparadores de expresiones regulares no son vulnerables al retroceso, como los
incluidos en awk o grep porque se basan en Thompson NFA .
https://riptutorial.com/es/home 66
Capítulo 21: Sustituciones con expresiones
regulares
Parámetros
En línea Descripción
$
Sustituye la subcadena que coincide con un nombre de grupo nombrado .
{nombre}
Los términos en cursiva significan que las cadenas son volátiles (puede variar
Nota:
dependiendo de su sabor regex).
Examples
Conceptos básicos de la sustitución
Una de las formas más comunes y útiles para reemplazar texto con expresiones regulares es
mediante el uso de grupos de captura .
O incluso un grupo de captura con nombre , como referencia para almacenar o reemplazar los
datos.
Hay dos términos bastante parecidos en los documentos de expresiones regulares, por lo que
puede ser importante nunca mezclar sustituciones (es decir, $1 ) con referencias (es decir, \1 ).
Los términos de sustitución se utilizan en un texto de reemplazo; Backreferences, en la expresión
Regex pura. Aunque algunos lenguajes de programación aceptan ambas sustituciones, no es
alentador.
Digamos que tenemos esta expresión regular: /hello(\s+)world/i . Cuando se hace referencia a
https://riptutorial.com/es/home 67
$number (en este caso, $1 ), los espacios en blanco que coincidan con \s+ serán reemplazados en
su lugar.
El mismo resultado se expondrá con la expresión regular: /hello(?<spaces>\s+)world/i . Y como
tenemos un grupo nombrado aquí, también podemos usar ${spaces} .
En este mismo ejemplo, también podemos usar $0 o $& ( Nota: $& puede usarse como $+ lugar, lo
que significa recuperar el último grupo de captura en otros motores de expresiones regulares),
dependiendo del sabor de expresiones regulares con el que esté trabajando, para obtener todo el
texto emparejado. (Es decir, $& devolverá hEllo woRld para la cadena: hEllo woRld of Regex! )
Eche un vistazo a este sencillo ejemplo de sustitución utilizando la cita adaptada de John Lennon
utilizando el $number y la sintaxis ${name} :
https://riptutorial.com/es/home 68
Reemplazo avanzado
Algunos lenguajes de programación tienen sus propias peculiaridades Regex, por ejemplo, el
término $+ (en C #, Perl, VB, etc.) que reemplaza el texto coincidente con el último grupo
capturado.
Ejemplo:
using System;
using System.Text.RegularExpressions;
https://riptutorial.com/es/home 69
Debido a este hecho, estas cadenas de reemplazo deben hacer su trabajo así:
Regex: /part2/
Input: "part1part2part3"
Replacement: "$`"
Output: "part1part1part3" //Note that part2 was replaced with part1, due &` term
---------------------------------------------------------------------------------
Regex: /part2/
Input: "part1part2part3"
Replacement: "$'"
Output: "part1part3part3" //Note that part2 was replaced with part3, due &' term
Regex: /part2/
Input: "part1part2part3"
Replacement: "$_"
Output: "part1part1part2part3part3" //Note that part2 was replaced with part1part2part3,
// due $_ term
Imports System.Text.RegularExpressions
Module Example
Public Sub Main()
Dim input As String = "ABC123DEF456"
Dim pattern As String = "\d+"
Dim substitution As String = "$_"
Console.WriteLine("Original string: {0}", input)
Console.WriteLine("String with substitution: {0}", _
Regex.Replace(input, pattern, substitution))
End Sub
End Module
' The example displays the following output:
' Original string: ABC123DEF456
' String with substitution: ABCABC123DEF456DEFABC123DEF456
Si desea hacer coincidir una cadena como esta: USD: $3.99 por ejemplo, y desea almacenar la
3.99 , pero reemplazarla por $3.99 con una sola expresión regular, puede usar:
https://riptutorial.com/es/home 70
Regex: /USD:\s+\$([\d.]+)/
Input: "USD: $3.99"
Replacement: "$$$1"
To Store: "$1"
Output: "$3.99"
Stored: "3.99"
Referencias
https://riptutorial.com/es/home 71
Capítulo 22: Tipos de motores de
expresiones regulares
Examples
NFA
Principio
El patrón regex se analiza en un árbol.
Si el algoritmo logra salir del árbol, informa una coincidencia exitosa. De lo contrario, cuando se
han probado todas las posibilidades, la coincidencia falla.
Optimizaciones
Los motores Regex suelen aplicar algunas optimizaciones para un mejor rendimiento. Por
ejemplo, si determinan que una coincidencia debe comenzar con un carácter dado, intentarán una
coincidencia solo en aquellas posiciones en la cadena de entrada donde aparece ese carácter.
Ejemplo
https://riptutorial.com/es/home 72
abeacab coincidir a(b|c)a con la cadena de entrada abeacab :
CONCATENATION
EXACT: a
ALTERNATION
EXACT: b
EXACT: c
EXACT: a
a(b|c)a abeacab
^ ^
ase encuentra en la cadena de entrada, consúmala y continúe con el siguiente elemento del árbol
de patrones: la alternancia. Prueba la primera posibilidad: una b exacta.
a(b|c)a abeacab
^ ^
Se encuentra b , por lo que la alternancia tiene éxito, consúmala y continúe con el siguiente
elemento en la concatenación: una exacta a :
a(b|c)a abeacab
^ ^
a(b|c)a abeacab
^ ^
a(b|c)a abeacab
^ ^
a(b|c)a abeacab
^ ^
https://riptutorial.com/es/home 73
a(b|c)a abeacab
^ ^
a(b|c)a abeacab
^ ^
a(b|c)a abeacab
^ ^
a(b|c)a abeacab
^ ^
a(b|c)a abeacab
\_/
DFA
Principio
El algoritmo escanea a través de la cadena de entrada una vez , y recuerda todas las rutas
posibles en la expresión regular que podrían coincidir. Por ejemplo, cuando se encuentra una
alternancia en el patrón, se crean dos nuevas rutas y se intentan de forma independiente. Cuando
una ruta dada no coincide, se elimina de las posibilidades establecidas.
Trascendencia
El tiempo coincidente está limitado por el tamaño de la cadena de entrada. No hay retroceso, y el
motor puede encontrar varias coincidencias simultáneamente, incluso coincidencias
superpuestas.
Ejemplo
https://riptutorial.com/es/home 74
Empareja a(b|c)a contra abadaca :
abadaca a(b|c)a
^ ^ Attempt 1 ==> CONTINUE
abadaca a(b|c)a
^ ^ Attempt 2 ==> FAIL
^ Attempt 1.1 ==> CONTINUE
^ Attempt 1.2 ==> FAIL
abadaca a(b|c)a
^ ^ Attempt 3 ==> CONTINUE
^ Attempt 1.1 ==> MATCH
abadaca a(b|c)a
^ ^ Attempt 4 ==> FAIL
^ Attempt 3.1 ==> FAIL
^ Attempt 3.2 ==> FAIL
abadaca a(b|c)a
^ ^ Attempt 5 ==> CONTINUE
abadaca a(b|c)a
^ ^ Attempt 6 ==> FAIL
^ Attempt 5.1 ==> FAIL
^ Attempt 5.2 ==> CONTINUE
abadaca a(b|c)a
^ ^ Attempt 7 ==> CONTINUE
^ Attempt 5.2 ==> MATCH
abadaca a(b|c)a
^ ^ Attempt 7.1 ==> FAIL
^ Attempt 7.2 ==> FAIL
https://riptutorial.com/es/home 75
Capítulo 23: Trampas Regex
Examples
¿Por qué el punto (.) No coincide con el carácter de nueva línea ("\ n")?
Entonces, para cadenas simples, como hello world .* Funciona perfectamente. Pero si tiene una
cadena que representa, por ejemplo, líneas en un archivo, estas líneas estarán separadas por un
separador de línea , como \n (nueva línea) en sistemas similares a Unix y \r\n (retorno de carro y
nueva línea) en Windows
Por defecto en la mayoría de los motores de expresiones regulares, . no coincide con los
caracteres de nueva línea, por lo que la coincidencia se detiene al final de cada línea lógica . Si
quieres . para hacer coincidir realmente todo, incluidas las nuevas líneas, debe habilitar el modo
"punto-coincidencias-todo" en el motor de re.DOTALL regulares de su elección (por ejemplo,
agregue re.DOTALL flag en Python, o /s en PCRE).
Aquí tenemos dos conjuntos de citas. Asumamos que queremos hacer coincidir ambas, de modo
que nuestra expresión regular coincida con "Dostoevski" y "Good evening."
".*" # matches a quote, then any characters until the next quote
Pero no funciona: coincide con la primera cita en "Dostoevski" y hasta la cita de cierre en "Good
evening." , incluyendo el and said: parte. Demo regex101
https://riptutorial.com/es/home 76
citas?
Use [^"]* . No come toda la entrada, solo hasta la primera " , según sea necesario. Demo
regex101
https://riptutorial.com/es/home 77
Capítulo 24: Útil escaparate Regex
Examples
Emparejar una fecha
Debe recordar que la expresión regular fue diseñada para coincidir con una fecha (o no). Decir
que una fecha es válida es una lucha mucho más complicada, ya que requerirá una gran cantidad
de manejo de excepciones (consulte las condiciones del año bisiesto ).
0?[1-9]|1[0-2]
0?[1-9]|[12][0-9]|3[01]
(?:19|20)[0-9]{2}
El separador puede ser un espacio, un guión, una barra oblicua, un espacio vacío, etc. Siéntase
libre de agregar cualquier cosa que crea que pueda usarse como separador:
[-\\/ ]?
Si desea ser un poco más pedante, puede usar una referencia posterior para asegurarse de que
los dos separadores sean iguales:
Hacer coincidir una dirección de correo electrónico dentro de una cadena es una tarea
difícil, porque la especificación que la define, el RFC2822 , es compleja, lo que dificulta
su implementación como una expresión regular. Para obtener más detalles sobre por
https://riptutorial.com/es/home 78
qué no es una buena idea hacer coincidir un correo electrónico con una expresión
regular, consulte el ejemplo antipattern cuando no use una expresión regular: para
correos electrónicos coincidentes . El mejor consejo para tomar nota de esa página es
usar una biblioteca revisada por pares y ampliamente en su idioma favorito para
implementar esto.
^\S{1,}@\S{2,}\.\S{2,}$
Esa expresión regular comprobará que la dirección de correo es una secuencia de caracteres de
longitud superior a uno sin espacios separados por espacios, seguida de una @ , seguida de dos
secuencias de caracteres de espacios no espacios de dos o más caracteres separados por a . .
No es perfecto y puede validar direcciones no válidas (según el formato), pero lo más importante
es que no invalida las direcciones válidas.
Por lo tanto, la única forma de verificar que el correo es válido y existe es enviar un correo
electrónico a esa dirección.
Los mejores ejemplos de expresiones regulares de este tipo se encuentran en las bibliotecas
estándar de algunos idiomas. Por ejemplo, hay uno del módulo RFC::RFC822::Address en la
https://riptutorial.com/es/home 79
biblioteca de Perl que intenta ser lo más preciso posible de acuerdo con el RFC. Para su
curiosidad, puede encontrar una versión de esa expresión regular en esta URL , que se ha
generado a partir de la gramática, y si está tentado de copiarla, aquí hay una cita del autor de la
expresión regular:
" No mantengo la expresión regular [vinculada]. Puede que haya errores que ya se
hayan solucionado en el módulo Perl " .
Otra variante más corta es la que usa la biblioteca estándar .Net en el módulo
EmailAddressAttribute :
^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-
z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-
\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-
\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-
\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-
\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-
\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-
|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-
\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-
\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-
\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$
Pero incluso si es más corto , todavía es demasiado grande para ser legible y fácil de mantener.
En ruby, una composición de expresiones regulares se está utilizando en el módulo rfc822 para
que coincida con una dirección. Esta es una buena idea, ya que en el caso de que se encuentren
errores, será más fácil identificar la parte de expresiones regulares para cambiarla y corregirla.
Aquí le indicamos cómo hacer coincidir un código de prefijo (a + o (00), luego un número del 1 al
1939, con un espacio opcional):
Esto no busca un prefijo válido sino algo que podría ser un prefijo. Ver la lista completa de prefijos
(?:00|\+)?[0-9]{4}
Luego, como la longitud total del número de teléfono es, como máximo, 15, podemos buscar
hasta 14 dígitos:
Se gasta al menos 1 dígito para el prefijo
https://riptutorial.com/es/home 80
[0-9]{1,14}
Los números pueden contener espacios, puntos o guiones y se pueden agrupar por 2 o 3.
(?:[ .-][0-9]{3}){1,5}
(?:(?:00|\+)?[0-9]{4})?(?:[ .-][0-9]{3}){1,5}
Si desea hacer coincidir un formato de país específico, puede utilizar esta consulta de búsqueda y
agregar el país, la pregunta ya ha sido hecha.
IPv4
Para coincidir con el formato de la dirección IPv4, debe verificar los números [0-9]{1,3} tres veces
{3} separados por puntos \. y terminando con otro número.
^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$
Esta expresión regular es demasiado simple: si desea que sea precisa, debe verificar que los
números estén entre 0 y 255 , con la expresión regular anterior que acepta 444 en cualquier
posición. ¿Quiere verificar 250-255 con 25[0-5] , o cualquier otro valor 200 2[0-4][0-9] , o
cualquier valor 100 o menos con [01]?[0-9][0-9] . Desea comprobar que va seguido de un punto
\. tres veces {3} y luego una vez sin un punto.
^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
IPv6
^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$
Esto, sin embargo, es insuficiente. Como las direcciones IPv6 pueden volverse bastante
"complicadas", la norma especifica que las palabras de solo cero pueden reemplazarse por :: .
Esto solo se puede hacer una vez en una dirección (para cualquier lugar entre 1 y 7 palabras
consecutivas), ya que de otro modo sería indeterminado. Esto produce una serie de variaciones
(bastante desagradables):
https://riptutorial.com/es/home 81
^::(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}$
^[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,5}[0-9a-fA-F]{1,4}$
^[0-9a-fA-F]{1,4}:[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,4}[0-9a-fA-F]{1,4}$
^(?:[0-9a-fA-F]{1,4}:){0,2}[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,3}[0-9a-fA-F]{1,4}$
^(?:[0-9a-fA-F]{1,4}:){0,3}[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,2}[0-9a-fA-F]{1,4}$
^(?:[0-9a-fA-F]{1,4}:){0,4}[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:)?[0-9a-fA-F]{1,4}$
^(?:[0-9a-fA-F]{1,4}:){0,5}[0-9a-fA-F]{1,4}::[0-9a-fA-F]{1,4}$
^(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}::$
^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$|
^::(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}$|
^[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,5}[0-9a-fA-F]{1,4}$|
^[0-9a-fA-F]{1,4}:[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,4}[0-9a-fA-F]{1,4}$|
^(?:[0-9a-fA-F]{1,4}:){0,2}[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,3}[0-9a-fA-F]{1,4}$|
^(?:[0-9a-fA-F]{1,4}:){0,3}[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,2}[0-9a-fA-F]{1,4}$|
^(?:[0-9a-fA-F]{1,4}:){0,4}[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:)?[0-9a-fA-F]{1,4}$|
^(?:[0-9a-fA-F]{1,4}:){0,5}[0-9a-fA-F]{1,4}::[0-9a-fA-F]{1,4}$|
^(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}::$
Asegúrate de escribirlo en modo multilínea y con un montón de comentarios para que quienquiera
que tenga la tarea inevitable de averiguar qué significa esto no te persiga con un objeto
contundente.
^(?:0?[0-9]|1[0-2])[-:][0-5][0-9]\s*[ap]m$
Dónde
• (?:0?[0-9]|1[0-2]) es la hora
• [-:] es el separador, que puede ajustarse para adaptarse a sus necesidades
• [0-5][0-9] es el minuto
• \s*[ap]m siguió cualquier número de caracteres de espacio en blanco, y am o pm
^(?:0?[0-9]|1[0-2])[-:][0-5][0-9][-:][0-5][0-9]\s*[ap]m$
^(?:[01][0-9]|2[0-3])[-:h][0-5][0-9]$
Dónde:
• (?:[01][0-9]|2[0-3]) es la hora
• [-:h] el separador, que puede ajustarse para adaptarse a sus necesidades
https://riptutorial.com/es/home 82
• [0-5][0-9] es el minuto
^(?:[01][0-9]|2[0-3])[-:h][0-5][0-9][-:m][0-5][0-9]$
Donde [-:m] es un segundo separador, reemplazando la h por horas con una m por minutos, y [0-
5][0-9] es el segundo.
Célula Célula
(GIR 0AA)|((([A-Z-[QVX]][0-9][0-9]?)|(([A-Z-[QVX]][A-Z-[IJZ]][0-9][0-9]?)|(([A-Z-[QVX]][0-
9][A-HJKPSTUW])|([A-Z-[QVX]][A-Z-[IJZ]][0-9][ABEHMNPRVWXY])))) [0-9][A-Z-[CIKMOV]]{2})
(GIR 0AA)|((([A-Z-[QVX]][0-9][0-9]?)|(([A-Z-[QVX]][A-Z-[IJZ]][0-9][0-9]?)|(([A-Z-[QVX]][0-
9][A-HJKPSTUW])|([A-Z-[QVX]][A-Z-[IJZ]][0-9][ABEHMNPRVWXY]))))
Segundo:
[0-9][A-Z-[CIKMOV]]{2})
https://riptutorial.com/es/home 83
Capítulo 25: Validación de contraseñas de
expresiones regulares
Examples
Una contraseña que contiene al menos 1 mayúscula, 1 minúscula, 1 dígito, 1
carácter especial y tiene una longitud de al menos 10
Como los caracteres / dígitos pueden estar en cualquier lugar dentro de la cadena, requerimos
lookaheads. Lookaheads son de zero width lo que significa que no consumen ninguna cadena. En
palabras simples, la posición de verificación se restablece a la posición original después de que
se cumple cada condición de búsqueda anticipada.
^(?=.{10,}$)(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*\W).*$
Antes de continuar con la explicación, veamos cómo funciona la expresión regular ^(?=.*[az]) (la
longitud no se considera aquí ) en la cadena 1$d%aA
Desglose regex
^ #Starting of string
(?=.{10,}$) #Check there is at least 10 characters in the string.
#As this is lookahead the position of checking will reset to starting again
(?=.*[a-z]) #Check if there is at least one lowercase in string.
https://riptutorial.com/es/home 84
#As this is lookahead the position of checking will reset to starting again
(?=.*[A-Z]) #Check if there is at least one uppercase in string.
#As this is lookahead the position of checking will reset to starting again
(?=.*[0-9]) #Check if there is at least one digit in string.
#As this is lookahead the position of checking will reset to starting again
(?=.*\W) #Check if there is at least one special character in string.
#As this is lookahead the position of checking will reset to starting again
.*$ #Capture the entire string if all the condition of lookahead is met. This is not required
if only validation is needed
^(?=.{10,}$)(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[0-9])(?=.*?\W).*$
^(?=.{10,}$)(?=(?:.*?[A-Z]){2})(?=.*?[a-z])(?=(?:.*?[0-9]){2}).*$
^(?=.{10,}$)(?=(?:.*[A-Z]){2})(?=.*[a-z])(?=(?:.*[0-9]){2}).*
https://riptutorial.com/es/home 85
https://riptutorial.com/es/regex/topic/5340/validacion-de-contrasenas-de-expresiones-regulares
https://riptutorial.com/es/home 86
Creditos
S.
Capítulos Contributors
No
Combinadores de
UTF-8: letras,
5 mudasobwa
marcas, puntuación,
etc.
Cuando NO debes
6 usar Expresiones dorukayhan, Kendra, zmo
Regulares
Cuantificadores
7 Mark Hurd, Sebastian Lenartowicz
Posesivos
Grupos de captura
11 Thomas Ayoub
con nombre
https://riptutorial.com/es/home 87
Modificadores de
14 expresiones Eder, Mateus, Tim Pietzcker, Wiktor Stribiżew
regulares (banderas)
Restablecer partido:
19 nhahtdh, Wiktor Stribiżew, Will Barnwell
\K
Sustituciones con
21 expresiones Mateus
regulares
Tipos de motores de
22 expresiones Lucas Trzesniewski, Markus Jarderot
regulares
Validación de
contraseñas de
25 rock321987
expresiones
regulares
https://riptutorial.com/es/home 88