• Publicidad

String dinámico

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

String dinámico

Notapor BigBear » 2016-11-03 11:09 @506

Hola. Tengo un string con un contenido como este:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
"hola" "chau" "dos" "tres"
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

El tema es que puede ir variando y tener más palabras entre comillas.

Como expresión regular no puedo solucionarlo porque se vuelve dinámico y cambiante. Como split() tampoco, porque solo me permite una comilla doble " y no sacaría lo que busco.

Al resultado lo quiero colocar en un array de resultado. ¿Alguien conoce alguna solución a este extraño problema?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Publicidad

Re: String dinámico

Notapor explorer » 2016-11-03 16:42 @737

Con expresiones regulares es muy sencillo: el patrón que buscamos es contenido entrecomillado doble:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.14;
  3.  
  4. my $string = q("hola" "chau" "dos" "tres");
  5.  
  6. while ( $string =~ /("(?:.*?)")/g) {
  7.     say $1;                             # "hola", "chau", "dos", "tres"
  8. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Con split... pues depende...

Si estamos seguros que los contenidos,
a) están separados por uno o más espacios en blanco, y
b) NO hay espacios en blanco dentro de los contenidos,
entonces se puede resolver muy fácilmente: usando los espacios en blanco como delimitadores.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.14;
  3.  
  4. my $string = q("hola" "chau" "dos" "tres");
  5.  
  6. my @resultado = split " ", $string;
  7.  
  8. say join ",", @resultado;       # "hola","chau","dos","tres"
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Pero... si no se cumplen esas dos reglas, habrá que complicar un poco más la expresión regular. Debería funcionar igual que en la primera solución que usamos comillas dobles como anclas para buscar el contenido, pero esta vez tenemos que hacer lo contrario: queremos buscar las comillas dobles que delimitan el espacio que separa los contenidos. Y no debemos permitir que formen parte de la partición, pues entonces las perdemos (como decías en tu mensaje).

Para ello, usaremos expresiones regulares extendidas.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.14;
  3.  
  4. my $string = q("hola" "chau" "dos y medio" "tres");
  5.  
  6. my @resultado = split /(?<=")\s+(?=")/, $string;
  7.  
  8. say join ",", @resultado;       # "hola","chau","dos y medio","tres"
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Con los paréntesis de patrones extendidas, estamos buscando por comillas dobles separadas por uno o más espacios en blanco, PERO sin formar parte del delimitador (el espacio en blanco), por lo que siguen formando parte del contenido que queremos guardar.

Más información en tu propio ordenador en perldoc perlre, y en la Web (traducido al español).
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


Volver a Básico

¿Quién está conectado?

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

cron