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:

https://grow.leanmind.es/uploads/default/original/1X/c357b028eac2a1448d993bf279fff1363e5b1180.gif

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 caracter que no sea un número\D\D\DABC
\WUn caracter que no sea un número ni una letra\W\W\W\W\W*-+=)
\SUn caracter que no sea un espacio\S\S\S\SYoyo
.Cualquier caracter 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 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

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 vecesABC*AAACC
?Una o ninguna vezplurals?plural

Lógica

CharactersLegendRegex ExampleCoincidence Example
|Alternación (tipicamente OR)22|33|3322
( … )Capturar gruposA(nt|pple)Apple (captura “pple”)
\1Contenido del grupo 1r(\w)g\1xregex
\2Contenido del grupo 2(\d\d)+(\d\d)=\2+\112+65=65+12
(?: … )Grupo que no coincideA(?:nt|pple)Apple

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:

Untitled

En la primera fila del menú podemos apreciar:

: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:: Al lado de la lupa nos encontramos el campo donde introduciremos nuestro patrón de búsqueda

: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:: Mover al resultado superior

:arrow_down:: Mover al resultado inferior

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

: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:: 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:: Al lado de la lupa nos encontramos el campo donde introduciremos nuestro patrón de reemplazo

: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.
https://grow.leanmind.es/uploads/default/original/1X/24dc9862f013d27cc7ed63081fe87a99b69f4974.gif
  • 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.
https://grow.leanmind.es/uploads/default/original/1X/ab6ebcb9c14078a528e77d0ca5306f5adcd4ee92.gif
  • 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.
https://grow.leanmind.es/uploads/default/original/1X/603c4df89856471e0e58e64d7b48d0244cd8ae0f.gif

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *