• Publicidad

Usando slash y backslash en regex

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Usando slash y backslash en regex

Notapor creating021 » 2008-07-17 19:43 @863

Hola.

Tengo un string lleno escapes sin "escapar" y necesito "escaparlos":

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my %escapes = (
    '\t' => "\t",
    '\r' => "\r",
    '\n' => "\n",
    '\a' => "\a"
);

my $string = '\aHola\n\tDOS EOL\r\n';
foreach my $escape ( keys %escapes ) {
    my $final = $escapes{$escape};
    $string =~ s/\Q$escapes\E/$final/g;
}
say $string;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Eso funciona muy bien, pero resulta que si tengo 'america\\argentina' (por decir algo) surgen problemas con la regexp.

¿Cómo trabajo los backslash, slash y las comillas (simples y dobles)?
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Publicidad

Notapor explorer » 2008-07-18 08:58 @415

Si solo tuvieras secuencias de escape 'normales', lo podrías resolver de forma muy fácil: evaluando dos veces.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $string = '\aHola\n\tDOS EOL\r\n';
$string = eval qq{qq{$string}};
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El problema es para los casos en que '\a', como pones, esté en 'america\\argentina'.

Si no encuentras una regla fija que diga que eso es una secuencia de escape, o no, no podremos sacar una solución.

Yo probaría el módulo String::Escape, con la función unprintable(). Pero aún así, no es capaz de distinguir el caso de '\\argentina'.

Actualización: Sería posible resolverlo si hicieras un truco: doblas los '\\' y luego haces una conversión manual:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

my %escapes = (
    '\\\\' => '\\',
    '\t'   => "\t",
    '\r'   => "\r",
    '\n'   => "\n",
    '\a'   => "\a",
);

my $string = '\aHola\n\tDOS\\\\nEOL\r\n';
print "$string\n";

$string =~ s[\\\\][\\\\\\\\]g;
print "$string\n";

$string =~ s[(\\.)][$escapes{$1}]g;
print "$string\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Salida:
Código: Seleccionar todo
\aHola\n\tDOS\\nEOL\r\n
\aHola\n\tDOS\\\\nEOL\r\n
Hola
        DOS\\nEOL

Fíjate: doblamos los pares de '\' y luego lo reducimos con la ayuda del hash.

Otra forma más corta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

my $string = '\aHola\n\tDOS\\\\nEOL\r\n';
print "$string\n";

$string =~ s[\\\\][\\\\\\\\]g;
print "$string\n";

$string = eval qq{qq{$string}};
print "$string\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Código: Seleccionar todo
\aHola\n\tDOS\\nEOL\r\n
\aHola\n\tDOS\\\\nEOL\r\n
Hola
        DOS\\nEOL


Es decir: ya que el caso de '\\' es excepcional, lo 'escapamos' de forma directa, para que luego, todo el conjunto, pueda ser evaluado dos veces, para hacer efectivo todas las secuencias de escape.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Jenda » 2008-07-18 12:53 @578

'america\\argentina' eq 'america\argentina'
-------------------------------------------------------
- Estoy aquí para practicar español. Si te ayudó mi respuesta ayudame con un mensaje privado sobre mis faltas por favor. Seguramente habrá muchas :-)
Jenda
Perlero nuevo
Perlero nuevo
 
Mensajes: 132
Registrado: 2007-10-29 06:31 @313
Ubicación: Praga, Republica Checa

Notapor creating021 » 2008-07-21 18:25 @809

¡Súper! Muchas, pero muchas gracias :)
La solución es simple, eficaz y limpia... perfecta (creo yo).
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor


Volver a Intermedio

¿Quién está conectado?

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