Volver
Featured image of post Multi-reemplazo de texto usando Regex en IntelliJ

Multi-reemplazo de texto usando Regex en IntelliJ

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:

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

:ballot_box:
:ballot_box:
: Al lado de la lupa nos encontramos el campo donde introduciremos nuestro patrón de búsqueda

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

:arrow_up:
:arrow_up:
: Mover al resultado superior

:arrow_down:
:arrow_down:
: Mover al resultado inferior

:stop_button:
:stop_button:
: Ver los resultado en una ventana de búsqueda aparte

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

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

:ballot_box:
:ballot_box:
: Al lado de la lupa nos encontramos el campo donde introduciremos nuestro patrón de reemplazo

:leftwards_arrow_with_hook:
:leftwards_arrow_with_hook:
: 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.

Creado con Hugo
Tema Stack diseñado por Jimmy