RegEX: Buscar y Sustituir mediante EXPRESIONES REGULARES
RegEx es simplemente un “lenguaje” para BUSCAR y REEMPLAZAR texto. Es muy potente y tremendamente productivo cuando se sabe utilizar. Digo “lenguaje” entre comillas porque desgraciadamente NO ES UN ESTANDAR y los distintos motores de búsqueda RegEx incluidos en las distintas aplicaciones o lenguajes tienen diferencias en su sintaxis. En cualquier caso, una vez entendido el concepto no es mucho problema. SIGIL utiliza las convenciones de notación heredadas de Qt, el entorno de desarrollo que se ha usado para programarlo; aunque he leido que el autor está pensando sustituirlo por PCRE, que es la biblioteca PERL para RegEx incluida en C y sus variantes o en cualquier lenguaje de programación que permita usar librerias (Visual Basic).
¿Que hace RegEx y cómo lo hace?
RegEx permite buscar cadenas de texto sin declarar explicitamente sus componentes, lo que hace que sea posible encontrar cosas como: “un texto de 5 caracteres junto a 3 números al final de una palabra”, es decir permite añadir variables e incluso lógica a la busqueda de cadenas. Y a la hora de reemplazar permite definir que partes de la cadena deben ser reemplazadas y cuales no, lo que permite una flexibilidad completa. Pero todo esto es mucho más fácil de describir con un ejemplo.
EJEMPLO PRÁCTICO Necesito quitar los
<p class="calibre2">
y </p>
que estan alrededor del grupo <img class=”calibre6”.../>
Voy a buscar cuantos tengo en el texto:
<...src=../images/...p>
es variable ya que son los diferentes nombres de los gráficos insertados en el libro. Asi que en realidad lo que quiero encontrar son 2 cadenas fijas con una parte variable (PV)en el centro: <p class="calibre2"><img class="calibre6" src=(PV)/></p>
Voy a construir la RegEx que me seleccione esa parte variable:
Escribo entre corchetes los componentes que hay, para empezar “puntos” (.) y “barra inversa” (/) y como hay más de uno le pongo el asterisco (*) al final que significa “que el numero sea indifente”.
Si compruebo con “Contar” SIGIL me dice que ha encontrado 13 ocurrencias, luego vamos bien. Pero además hay números y letras, que podrán ser mayusculas o minusculas (no lo sé cierto); asi que los añado a la expresión de búsqueda:
Compuebo y sigo teniendo 13 ocurrencias, parece que ya he encontrado la parte variable (PV)luego sólo me resta añadir la cadena fija del final que empieza en la comilla (“) de cierre
Asi pues la expresión RegEx de búsqueda es:
<p class="calibre2"><img class="calibre6" src="[./a-zA-Z0-9]*" /></p>
Pero ahora crear la expresión de sustitución: Lo primero para poder reemplazar es que la parte/s variable/s de la expresión de búsqueda debe/n encerrarse entre parentesis ():
<p class="calibre2"><img class="calibre6" src="([./a-zA-Z0-9]*)" /></p>
Y ahora vamos con la expresión de sustitución:
Como queremos quitar la parte de los
<p class="calibre2">
y </p>
será: <img class="calibre6" src="([./a-zA-Z0-9]*)" /> pero sustituimos todas las partes variables (lo que está entre parentesis) por “\número”; es decir si tuvieramos 2 partes variables sustituiriamos por “\1” y “\2”. En nuestro caso queda así:
<img class="calibre6" src="\1" />
Le damos al botón de “Replace All”…
Como vemos ha realizado correctamente la sustitución. De un solo golpe 13 reeemplazos. Como veis, tremendamente útil.
En http://gskinner.com/RegExr/ teneis una página que puede ayudar a aprender y entender las expresiones regulares
http://www.regular-expressions.info/charclass.html
Vamos a seguir trabajando más ejemplos de RegEx (Expresiones Regulares) en próximas entradas, porque esta ya está quedando muy larga.
Y recordad, niños, esto es CERCA y esto es LEJOS
Hola, en el epub que he probado encuentro errores como los que señalas, pero mediante la búsqueda con Sigil me dice "the search term cannot be found". ¿Qué hago mal?
ResponderEliminar