• Publicidad

Expresiones regulares y fundamentos de programación

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Expresiones regulares y fundamentos de programación

Notapor ana gonzález ledesma » 2006-11-07 06:17 @304

Hola, otra vez. Ahora estoy trabajando con un texto etiquetado en XML. Y estoy haciendo expresiones regulares para extraer el texto que necesito de entre dos etiquetas determinadas. Imaginaros:
Código: Seleccionar todo
<etiqueta>aquí hay todo tipo de caracteres</etiqueta><etiqueta>aquí lo mismo</etiqueta>

Imaginaros que todo esto está en la misma línea. El problema viene cuando hago la siguiente expresión regular para extraer el texto que está entre las etiquetas:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$_=~ s/<etiqueta>(.+)<\/etiqueta>/$1/g;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Si pongo esto, lo que hace Perl es coger la primera etiqueta de apertura y la última de cierre.
Para aclararme, he hecho un programa superbásico de este tipo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$texto="hola cereza holados hola plátano holados";
$_=~ s/hola(.+)holados/$1/g;
print $dolar=$1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

y el resultado es de $1 es: cereza holados hola plátano,
o sea, lo que está entre el primer hola y el último holados.
En realidad es una duda de fundamentos de programación.

Según mi lógica, lo que Perl debería hacer al encontrarse una expresión regular de este tipo es ir leyendo carácter por carácter hasta toparse con el primer holados y ahí hacer pattern matching; y después, como le he puesto la g, debería seguir buscando este mismo patrón en el resto de la línea que todavía le quedaría por leer, a ver si lo encuentra.

Pero parece que el programa no razona así; no lo entiendo, ¿alguien me lo podría explicar, por favor?
ana gonzález ledesma
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2006-11-02 10:25 @475

Publicidad

Notapor explorer » 2006-11-07 07:16 @344

Lo que pasa, Ana, es que los cuantificadores son, por defecto, glotones.

De perlre:
By default, a quantified subpattern is "greedy", that is, it will match as many times as possible (given a particular starting location) while still allowing the rest of the pattern to match. If you want it to match the minimum number of times possible, follow the quantifier with a "?". Note that the meanings don't change, just the "greediness"


Eso quiere decir que Perl intentará emparejar la expresión regular con la mayor cantidad posible de información que le pasemos.

En tu caso, es justo lo contrario.

Para eso, dile que se pare en la primera coincidencia, cambiando .* por .*?:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$linea = '<etiqueta>aquí hay todo tipo de caracteres</etiqueta><etiqueta>aquí lo mismo</etiqueta>';
$linea =~ s/<etiqueta>(.+?)<\/etiqueta>/$1/g;
print $linea;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor kidd » 2006-11-07 14:22 @640

Ummm, yo te recomiendo que mejor uses un parser de XML, te va a quitar muchos dolores de cabeza.

http://search.cpan.org/~grantm/XML-Simp ... /Simple.pm


Saludos
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados