RegExp en Writer: cómo encontrar algo que esté antes o después de un texto definido

En mi libro sobre Writer dediqué un capítulo a las expresiones regulares (RegExp por su nombre en inglés, Regular Expressions), una potente herramienta para buscar texto «no exacto». En ese capítulo di las nociones básicas del sistema y algunos ejemplos, como encontrar palabras repetidas, identificar números arbitrarios en medio de un texto normal, etcétera.

Pero las RegExp pueden hacer mucho, muchísimo más de lo que comenté en aquel capítulo introductorio y el artículo de hoy es un ejemplo de ello.

Pero antes, asegúrate, lector, de repasar el correspondiente capítulo que de lo contrario no se entenderá lo que sigue.

¿Listo? Pues allá vamos.

Supongamos que queremos seleccionar un texto que esté antes de otro, pero sin seleccionar este último. Por ejemplo, podríamos querer seleccionar cualquier palabra que sea seguida de un punto. Lo que necesitamos es lo que en la jerga de las RegExp se llama Look-ahead assertion y que se construye con un par de paréntesis, un signo de interrogación y un igual:

término a seleccionar(?=elemento que no queremos seleccionar)

En el ejemplo de seleccionar cualquier palabra seguida de un punto (y recordando que \b representa un límite de palabra, \w representa un elemento de palabra, + representa una o más veces lo que está antes y que caracteres como el punto tienen que ser identificados como literales usando la barra invertida… por si el repaso del capítulo no ha dado resultado 😉 ) tendríamos que utilizar

\b\w+(?=\.)

Invirtamos ahora el desafío buscando algo que venga después de un elemento determinado, pero sin seleccionar dicho elemento. Lo que necesitamos aquí es una estrategia de Look-behind assertion y que se construye en forma similar al anterior, pero agregando en forma estratégica un signo de «menor que»:

(?<=elemento que no queremos seleccionar)término a seleccionar

Aquí por ejemplo podríamos tener un texto importado de fuentes dudosas que tiene varios espacios después de cada punto, no uno solo, y queremos solucionar este problema. Para esto (y recordando que la expresión {n,} indica encontrar al menos n veces lo que esté antes) tendríamos que usar

(?<=\.)[:space:]{2,}

Pero supongamos que estos espacios innecesariamente repetidos se den también después de un signo de admiración o de interrogación de cierre, en este caso (recordando que podemos utilizar los corchetes para indicar varias posibilidades) tendríamos que utilizar

(?<=[\.\?\!])[:space:]{2,}

¿Otro desafío? Pues podríamos buscar texto entre dos signos de admiración (apertura y cierre) sin seleccionar esos signos. Para eso (y recordando que expresiones el tipo [^a] sirven para negar el carácter en cuestión) podríamos usar

(?<=¡)[^\!]+(?=\!)

(¡lo que sigue al igual no es una i!)

Como último ejemplo, podríamos utilizar todo esto para el corregir el olvido de un espacio luego de un punto. Por ejemplo, si en un texto tenemos

Una oración.Segunda oración.¿Tercera oración? Cuarta. La quinta es correcta.

y queremos seleccionar solo los puntos que no son seguidos por un espacio podemos utilizar

(?<=\w)\.(?=[\w¿¡])

para luego reemplazarlos por un punto y un espacio.

Y claro, las RegExp son tan flexibles y poderosas que… dejo al lector el descubrir más trucos 😉


Para profundizar aún más en el asunto (en inglés):

Regular Expressions – ICU User Guide

Anuncios

  1. #1 por Mauricio Baeza el 27 marzo, 2015 - 23:27

    Las expresiones regulares siempre me han parecido como magia…

    • #2 por elpinguinotolkiano el 29 marzo, 2015 - 23:08

      Son magia. De hecho, diría magia negra… 😄

A %d blogueros les gusta esto: