RegEx (Expresiones Regulares)

facebook-svg gplus-svg twitter-svg

No te olvides: por defecto las expresiones regulares son codiciosas (greedy). Esto significa que una expresión regular devuelve la cadena de texto más larga que coincida con ella.
Las expresiones regulares son también ansiosas (eager) por devolver un resultado.

Para verificar tus regEx utiliza RegexPal

Modificadores

Modificadores Descripción
i Insensible a las mayúsculas y minúsculas W (case insensitive)
g Busqueda global (global match)
m Busqueda en multiples líneas de texto. (Multiple lines)
s Incluye saltos de línea. Sin él, las nuevas líneas son excluidas.

Clases de Carácteres (Ranges)

Expression Descripción
[abc] Encuentra uno de los caracteres entre corchetes
[^abc] Encuentra cualquier carácter que NO esté entre corchetes
[0-9] Encuentra un dígito de 0 a 9
[^0-9] Encuentra cualquier carácter que NO sea un dígito de 0 a 9
[A-Z] Encuentra cualquier carácter de
A mayuscula a Z mayuscula
[a-z] Encuentra cualquier carácter de
a minuscula a z minuscula
[A-z] Encuentra cualquier carácter de
A mayuscula a z minuscula
[adgk] Encuentra uno de los caracteres entre corchetes
[^adgk] Encuentra cualquier carácter que NO esté entre corchetes
(a|b) a o b
(...) Se utilizan para agrupar partes de una expresión.

Cuantificadores

El metacarácter ? (detras de otro metacarácter) hace que una expresión regular, habitualmente codiciosa (greedy), se convierta en perezosa (lazy), y resulte en la cadena más corta posible que coincida con ella.

Greedy Lazy Descripcion
* *? 0 o más veces
+ +? 1 o más veces
? ?? 0 o 1 veces
{ n } { n }? n veces
{ n ,} { n ,}? n o más veces
{ n , m } { n , m }? De n a m veces

Anclas

Metacarácter Descripción
^ Comienzo de una línea
$ Final de una línea
\A Comienzo de una cadena de texto (string). Nunca final de línea.
(Soporte: Java, .NET, Perl,PHP, Python,Ruby)
\Z Fin de cadena de texto (string). Nunca final de línea.
(Soporte: Java, .NET, Perl,PHP, Python,Ruby)
\b Principio o final de palabra (Word boundary)
\B NO al principio o al final de una palabra

Retroreferencias (backreference)

Para designar una retroreferencia (backreference), a veces utilizamos la barra inversa ( \ ), otras veces el dólar ( $ ), dependiendo del lenguaje que se utilice.

  Descripción
$n \n n-ésimo grupo no pasivo (no-passive group)
$2 \2 "xyz" en /^ (abc)(xyz) $/
$2 \2 "xyz" en /^ (abc(xyz)) $/
?   cambia el significado del grupo
:   el significado del grupo es: pasivo
?:   especifica un grupo pasivo
(passive group / non-capturing group)
$1 \1 "xyz" en /^ (?:abc)(xyz) $/
(porque el primer grupo es pasivo)

Más sobre retroreferencias

POSIX
(Portable Operating System Interface)

Manera correcta de utilizarlos:
[[:alpha:]] or [^[:alpha:]].

Soporte:
SI: Perl, PHP, Ruby, Unix
NO: Java, JavaScript, .NET, Python

POSIX Descripción
[:alpha:] Caracteres alfabeticos
[a-zA-Z]
[:digit:] Dígitos
[0-9]
[:alnum:] Caracteres alfanuméricos
[a-zA-Z0-9]
[:lower:] Letras minúsculas
[a-z]
[:upper:] Letras mayúsculas
[A-Z]
[:word:] Letras, números y el guion bajo
[A-Za-z0-9_]
[:punct:] Punctuacion y símbolos.
[!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~]
[:space:] Espacios en blanco, incluido <br />
[ \t\r\n\v\f]
[:blank:] Espacio y tabulador
[ \t]
[:print:] Caracteres visibles y espacios (i.e: excepto los carácteres de control)
[\x20-\x7E]
[:graph:] Caracteres visibles (i.e: excepto espacios, carácteres de control, etc.)
[\x21-\x7E]
[:xdigit:] Dígitos hexadecimales
[A-Fa-f0-9]
[:ascii:] Caracteres ASCII
[\x00-\x7F]
[:cntrl:] Caracteres de control
[\x00-\x1F\x7F]

Metacaracteres basicos

Los metacaracteres deben ser escapados cuando se utilicen como caracteres normales.

Metacarácter Descripción
. Cualquier carácter excepto salto de linea
* Indica que el carácter precedente puede ocurri 0 o más veces.
+ Indica que el carácter precedente puede ocurri 1 o más veces.
? Indica que el carácter precedente puede ocurrir 0 o 1 vez.
Hace que el metacaracter anterior sea perezoso (lazy)
[ Abre un set de caracteres
] Cierra un set de caracteres
^ Niega un set de caracteres ( como en [^0-9] )
- Define un set de caracteres ( de 0 a 9: [0-9] )
{ Comienza la repetición cuantificada del carácter precedente {min,max}
} Acaba la repetición cuantificada del carácter precedente {min,max}
( El comienzo de un grupo de caracteres.
) El fin de un grupo de caracteres.
| Alterna entre uno y otro carácter
\ El carácter de escape
(Escape character)

Characters específicos

Carácter Descripción Equivalente
\w Encuentra un carácter alfanumérico, incluido el guión bajo ( _ ) [a-z
A-Z0-9_]
\W Encuentra cualquier carácter NO alfanumérico [^a-z
A-Z0-9_]
\d Encuentra un dígito [0-9]
\D Encuentra cualquier carácter que NO es un dígito. [^0-9]
\s Encuentra un espacio en blanco [ \t\r\n]
\S Encuentra cualquier carácter que NO es un espacio en blanco. [^ \t\r\n]
\b Encuentra una coincidencia al inicio o al final de una palabra.  
\B Encuentra una coincidencia que NO està al inicio o al final de una palabra.  
\0 Encuentra un carácter NUL  
\n Salto de línea (new line)  
\f Salto de página (feed)  
\r Retorno de carro (return)  
\t Tabulador  
\v Tabulador vertical  
\xxx Representa un carácter especificado por un número octal xxx  
\xdd Representa un carácter especificado por un número hexadecimal dd  
\uxxxx Representa un carácter Unicode especificado por un número hexadecimal xxxx  

Declaraciones
(Assertions)

  Descripción
?= declaración positiva de búsqueda hacia delante
(positive lookahead assertion)
/(?=prematuro)pre/ encuentra pre de prematuro
pero no pre de precavido
/pre(?=maturo)/ encuentra pre de prematuro
pero no pre de precavido
?! declaración negativa de búsqueda hacia delante
(negative lookahead assertion)
/(?!prematuro)pre/ encuentra pre
pero no de prematuro
/pre(?!maturo)/ encuentra pre
pero no de prematuro
?<= declaración positiva de búsqueda hacia atras
(positivee lookbehind assertion)
Soporte:
Si: .NET, Java, Perl, PHP, Python, Ruby 1.9
No:.JavaScript, Ruby 1.8, Unix
/(?<=balon)mano/ encuentra -mano de balonmano
pero no de antemano
?<! declaración negativa de búsqueda hacia atras
(negative lookbehind assertion)
Soporte:
Si: .NET, Java, Perl, PHP, Python, Ruby 1.9
No:.JavaScript, Ruby 1.8, Unix
/(?<!balon)mano/ encuentra -mano
pero no de balonmano

Más sobre declaraciones

Comodines UNICODE

Soporte:
Si: Java, .NET, Perl, PHP, Ruby
No: JavaScript, Python, Unix

  Descripción
\X Carácter comodin Unicode.
Encuentra cualquier carácter incluso salto de linea.
\p{xx} Un carácter con la propiedad xx
\P{xx} Un carácter sin la propiedad xx
M \p{M} Marca (acentos, tilde...etc)
L \p{L} Letra (incluye las letras accentuadas, la ñ...etc)
N \p{N} Numero
S \p{S} Símbolo
C \p{C} Otros

Para más Información:
Propiedades de los caracteres Unicode

RegEx útiles

  Descripción
(\bnegro\b)(?!.*\1) ultima ocurencia de "negro" en un texto
\b\w+\b(?=\.) palabras seguidas de un punto ( . ), pero no el punto.
^#(?:[0-9a-fA-F]{3}){1,2}$ un color hex