Multi-reemplazo de texto usando Regex en IntelliJ

10-09-2021

Por Raúl Padilla Delgado

¿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:

Image

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

CharactersLegendRegex ExampleCoincidence Example
\dDígitos del uno al nuevefile_\d\dfile_25
\wLetra, dígito o barra baja\w-\w\w\wA-b_1
\sEspacios, tabuladores, saltos de línea.a\sb\sca bc
\DUn carácter que no sea un número\D\D\DABC
\WUn carácter que no sea un número ni una letra\W\W\W\W\W*-+=)
\SUn carácter que no sea un espacio\S\S\S\SYoyo
.Cualquier carácter excepto salto de línea.*whatever, man.
Escapes a special character.*+? $^/\.*+? $^/\
\tTabT\t\w{2}T ab
\rCarriage return charactersee below
\nLine feed charactersee below
\r\nLine separator on WindowsAB\r\nCDABCD
[ … ]Uno de los caracteres dentro de los corchetes[AEIOU]One uppercase vowel
[ … ]Uno de los caracteres dentro de los corchetesT[ao]pTap 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

CharactersLegendRegex ExampleCoincidence Example
+Uno o más vecesVersion \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 vecesA_B_C*AAACC
?Una o ninguna vezplurals?plural

Lógica

CharactersLegendRegex ExampleCoincidence Example
Alternación (tipicamente OR)22
( … )Capturar gruposA(ntpple)
\1Contenido del grupo 1r(\w)g\1xregex
\2Contenido del grupo 2(\d\d)+(\d\d)=\2+\112+65=65+12
(?: … )Grupo que no coincideA(?:ntpple)

Anclajes y límites

CharactersLegendRegex ExampleCoincidence 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

CharactersLegendRegex ExampleCoincidence Example
(?i)no distingue entre mayúsculas y minúsculas(?i)MondaymonDAY
(?s)Con este modificador el . también reconocerá saltos de línea(?s)From A.*to ZFrom 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:

Image

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.
Image
  • 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.
Image
  • 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.
Image