Introducción
¿Que es una regex?
Regex hace referencia a “expresión regular” y se trata de la técnica que nos permite hacer búsquedas de una secuencia de caracteres atendiendo a un patrón de búsqueda.
El uso de expresiones regulares nos puede simplificar y acelerar el proceso de tener que reemplazar varios textos que entre sí cumplen un patrón coincidente. Veamos un ejemplo para que sea más sencillo, supongamos que tenemos un escrito en el que varias personas se están presentando, por ejemplo:
Hola, soy Raúl y tengo 20 años
Hola, soy María y tengo 25 años
Hola, soy Marcos y tengo 1 años
Cuando una persona tenga un año de edad deberíamos usar el singular en la palabra “años”, por lo que con una expresión regular vamos a modificar esa palabra para que nos sirva en ambos casos.
La expresión regular para buscar coincidencias
[s]$
Lo que coincide (entre *)
Hola, soy Raúl y tengo 20 año**s**
Hola, soy María y tengo 25 año**s**
Hola, soy Marcos y tengo 1 año**s**
La expresión regular para reemplazar texto
($0)
Lo que se reemplaza/añade/quita (entre *)
Hola, soy Raúl y tengo 20 año**(s)**
Hola, soy María y tengo 25 año**(s)**
Hola, soy Marcos y tengo 1 año**(s)**
O visto en formato GIF desde el IDE IntelliJ haciendo un reemplazo de texto usando el shortcut
Ctrl + r:
Antes de entrar en materia y ver como utilizar esta herramienta de reemplazo de texto, vamos a repasar los tipos de match que podemos usar para construir nuestras expresiones regulares.
Tipos de match
Caracteres
Characters | Legend | Regex Example | Coincidence Example |
---|---|---|---|
\d | Dígitos del uno al nueve | file_\d\d | file_25 |
\w | Letra, dígito o barra baja | \w-\w\w\w | A-b_1 |
\s | Espacios, tabuladores, saltos de línea. | a\sb\sc | a bc |
\D | Un caracter que no sea un número | \D\D\D | ABC |
\W | Un caracter que no sea un número ni una letra | \W\W\W\W\W | *-+=) |
\S | Un caracter que no sea un espacio | \S\S\S\S | Yoyo |
. | Cualquier caracter excepto salto de línea | .* | whatever, man. |
Escapes a special character | .*+? $^/\ | .*+? $^/\ | |
\t | Tab | T\t\w{2} | T ab |
\r | Carriage return character | see below | |
\n | Line feed character | see below | |
\r\n | Line separator on Windows | AB\r\nCD | ABCD |
[ … ] | Uno de los caracteres dentro de los corchetes | [AEIOU] | One uppercase vowel |
[ … ] | Uno de los caracteres dentro de los corchetes | T[ao]p | Tap or Top |
[ … ] | Uno de los caracteres dentro de los corchetes | [AB1-5w-z] | One of either: A,B,1,2,3,4,5,w,x,y,z |
- | Indicador de rango | [a-z] | One lowercase letter |
[x-y] | Un caracter dentro del rango de x a y | [A-Z]+ | GREAT |
[ -~]+ | Characters in the printable section of the ASCII table. | ||
[^x] | Un caracter que no es una x | [^a-z]{3} | A1! |
[^x-y] | Un caracter que NO está dentro del rango de x a y | [^ -~]+ | Characters that are not in the printable section of the ASCII table. |
[\d\D] | Un caracter que es númerico o no numérico | [\d\D]+ | Any characters, inc-luding new lines, which the regular dot doesn’t match |
Cuantificadores
Characters | Legend | Regex Example | Coincidence Example |
---|---|---|---|
+ | Uno o más veces | Version \w-\w+ | Version A-b1_1 |
{3} | Exactamente tres veces | \D{3} | ABC |
{2,4} | De dos a cuatro veces | \d{2,4} | 156 |
{3,} | Tres o más veces | \w{3,} | regex_tutorial |
* | Cero o más veces | A_B_C* | AAACC |
? | Una o ninguna vez | plurals? | plural |
Lógica
Characters | Legend | Regex Example | Coincidence Example |
---|---|---|---|
Alternación (tipicamente OR) | 22 | ||
( … ) | Capturar grupos | A(nt | pple) |
\1 | Contenido del grupo 1 | r(\w)g\1x | regex |
\2 | Contenido del grupo 2 | (\d\d)+(\d\d)=\2+\1 | 12+65=65+12 |
(?: … ) | Grupo que no coincide | A(?:nt | pple) |
Anclajes y límites
Characters | Legend | Regex Example | Coincidence Example |
---|---|---|---|
^ | Inicio de una línea | ^abc .* | abc (line start) |
$ | Final de una línea | .*? the end$ | this is the end |
Modificadores en línea
Characters | Legend | Regex Example | Coincidence Example |
---|---|---|---|
(?i) | no distingue entre mayúsculas y minúsculas | (?i)Monday | monDAY |
(?s) | Con este modificador el . también reconocerá saltos de línea | (?s)From A.*to Z | From Ato Z |
Herramienta de reemplazo de texto de IntelliJ
Vistazo a las opciones
En un fichero que contenga texto, combina Ctrl + r
para abrir el menú de reemplazo:
En la primera fila del menú podemos apreciar:
Cc
: Define si el patrón de búsqueda debe distinguir entre mayúsculas y minúsculas o no
W
: ???
.*
: Define si la búsqueda será utilizando expresiones regulares o texto normal
x/x
: El contador de resultado de la búsqueda
:ballot_box_with_check: -
Buscar solo en la selección de texto actual
-
Buscar solo en la opción que elijamos (todo el texto, comentarios, etc)
En la segunda fila del menú podemos apreciar:
A'A
: La activamos si queremos reemplazar texto manteniendo las mayúsculas y minúsculas tal como las encontramos
Replace
: Reemplazar la ocurrencia seleccionada
Replace All
: Reemplazar todas las ocurrencias
Exclude
: Excluir de ser reemplazada la ocurrencia seleccionada
Reemplazar texto usando Regex
- Reemplazo directo: Se trata de introducir directamente el texto que queremos se reemplaze con el que tenemos en cada coincidencia.
- Reemplazo usando único grupo: Cuando escribimos expresiones regulares sin agruparlas, es decir, sin introducirlas dentro de unos parentesis. A pesar de que en este caso no hemos agrupado dentro de nuestra expresión regular, tenemos un grupo al que podemos referirnos ($0) y se trata de cada coincidencia entera.
- Reemplazo usando grupos definidos: Cuando agrupamos dentro de nuestra expresión regular podemos realizar reemplazos de textos más avanzados. Tendremos el grupo $0 que hace referencia a cada coincidencia entera, y después tendremos $1, $2…, así por cada grupo creado.