Multi-reemplazo de texto usando Regex en IntelliJ
10-09-2021
¿Qué 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 carácter que no sea un número | \D\D\D | ABC |
\W | Un carácter que no sea un número ni una letra | \W\W\W\W\W | *-+=) |
\S | Un carácter que no sea un espacio | \S\S\S\S | Yoyo |
. | Cualquier carácter 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 carácter dentro del rango de x a y | [A-Z]+ | GREAT |
[ -~]+ | Characters in the printable section of the ASCII table. | ||
[^x] | Un carácter que no es una x | [^a-z]{3} | A1! |
[^x-y] | Un carácter 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 carácter que es numérico o no numérico | [\d\D]+ | Any characters, including new lines, which the regular dot doesnt 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:
🔎: En primer lugar, vemos el icono de una lupa en la que si pulsamos sobre ella veremos el historial de los patrones de búsqueda que hemos ido introduciendo
📦: Al lado de la lupa nos encontramos el campo donde introduciremos nuestro patrón de búsqueda
↩: Seguido, tenemos una flecha que si pulsamos sobre ella introduciremos un salto de línea
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
⬆: Mover al resultado superior
⬇: Mover al resultado inferior
🛑: Ver los resultado en una ventana de búsqueda aparte
✅ : Seleccionar el texto de todas las coincidencias y cerrar herramienta de reemplazo
-
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:
🔎: En primer lugar, vemos el icono de una lupa en la que si pulsamos sobre ella veremos el historial de los patrones de reemplazo que hemos ido introduciendo
📦: Al lado de la lupa, nos encontramos el campo donde introduciremos nuestro patrón de reemplazo
↩: Seguido, tenemos una flecha que si pulsamos sobre ella introduciremos un salto de línea
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.
