• Publicidad

Ayuda con regex

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

Ayuda con regex

Notapor Skull118 » 2013-08-21 13:02 @585

Acudo nuevamente debido a que ya agoté todas mis posibilidades (Googlear hasta casi morir), tengo lo siguiente en una línea:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $string='TEXTO ANTES DE LO QUE NECESITO CAMBIAR +chr(13)+ Y AQUÍ PUEDE IR O NO TEXTO.'
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Eso necesito cambiarlo por +chr(13)+ encerrado entre comillas simples.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $string='TEXTO ANTES DE LO QUE NECESITO CAMBIAR '+chr(13)+' Y AQUÍ PUEDE IR O NO TEXTO.'
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Desarrollé la siguiente exp. reg. que sí me encuentra el +chr(13)+ (supongo que está bien) pero, no me hace el cambio por lo que necesito.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $_=~ s/^[\x2b]chr[\x28]13[\x29][\x2b]$/\x27\x2b]chr\x2813\x29\x2b\x27/g;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Agradezco de antemano su apoyo.
Skull118
Perlero nuevo
Perlero nuevo
 
Mensajes: 53
Registrado: 2013-03-21 13:38 @610

Publicidad

Re: Ayuda con regex

Notapor explorer » 2013-08-21 13:17 @595

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. erl
  2. use v5.10;
  3.  
  4. my $string = q($string='TEXTO ANTES DE LO QUE NECESITO CAMBIAR +chr(13)+ Y AQUÍ PUEDE IR O NO TEXTO.');
  5.  
  6. # se puede usar cualquiera de estas
  7. $string =~ s/(\+chr\(13\)\+)/'$1'/g;
  8. $string =~ s/([+]chr\(13\)[+])/'$1'/g;
  9. $string =~ s/([+]chr[(]13[)][+])/'$1'/g;
  10.  
  11. # también así:
  12. my $chr13 = quotemeta('+chr(13)+');         # "escapa" los caracteres complicados
  13. $string =~ s/($chr13)/'$1'/g;
  14.  
  15. say $string; # $string='TEXTO ANTES DE LO QUE NECESITO CAMBIAR '+chr(13)+' Y AQUÍ PUEDE IR O NO TEXTO.'
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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ayuda con regex

Notapor Skull118 » 2013-08-21 13:25 @601

explorer, te agradezco muchísimo la ayuda, salió tal cual lo dijiste, lo único que no me quedó muy claro es por qué en vez de poner en la expresión regular la instrucción así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $chr13=quotemeta('+chr(13)+');
  2. $_=~ s/($chr13)/'$chr(13)'/g;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

se pone así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $chr13=quotemeta('+chr(13)+');
  2. $_=~ s/($chr13)/'$1'/g;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Mi duda es qué es, o de dónde sale el $1. Perdón, pero me causó MUCHA curiosidad. Gracias de antemano, maestro.
Skull118
Perlero nuevo
Perlero nuevo
 
Mensajes: 53
Registrado: 2013-03-21 13:38 @610

Re: Ayuda con regex

Notapor explorer » 2013-08-21 14:09 @631

$1 viene de la captura del primer par de paréntesis, en el lado izquierdo del operador s///.

Tienes razón en que, lo normal, sería poner $chr13 en lugar de $1, pero... no se debe hacer: $chr13 no contiene la cadena original que buscamos, sino la versión "escapada":
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. say $chr13;  # \+chr\(13\)\+
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Así que, si cambiamos $1 por $chr13, nos saldrá
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
$string='TEXTO ANTES DE LO QUE NECESITO CAMBIAR '\+chr\(13\)\+' Y AQUÍ PUEDE IR O NO TEXTO.'
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
que no es lo que queremos.

Si quieres, puedes dejarlo más claro, así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $string = q($string='TEXTO ANTES DE LO QUE NECESITO CAMBIAR +chr(13)+ Y AQUÍ PUEDE IR O NO TEXTO.');
  2.  
  3. my $chr13  = '+chr(13)+';               # cadena a buscar
  4.  
  5. $string =~ s/\Q$chr13\E/'$chr13'/g;     # buscamos, y sustituimos
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Las secuencias de "escape" \Q...\E hacen la labor de "escapado" que tiene la función quotemeta(), así que a los caracteres peligrosos se les pone un '\' delante. Eso se convierte en un patrón, se busca, y si se encuentra, se sustituye por la versión entrecomillada simple.
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

Re: Ayuda con regex

Notapor Skull118 » 2013-08-21 14:25 @642

Muchas gracias por la explicación, estoy entrándole con ganas a las exp. reg. pero sé que aún me hace falta bastante, tengo otra duda aprovechando el tema. ¿Cómo hago para reemplazar comillas simples por otras comillas simples? Por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $string='esto esta al final de la linea'+chr(13)+'''
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Y necesito cambiarlo por
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $string='esto esta al final de la linea'+chr(13)
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

He intentado con lo siguiente y nada, que no me funciona
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $_=~ s/[\x27\x27]+/''/g;
  2.  
  3. my $c3="'''";
  4.  
  5. $_=~ s/\Q$c3\E/''/g;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Gracias por tu ayuda, explorer.
Skull118
Perlero nuevo
Perlero nuevo
 
Mensajes: 53
Registrado: 2013-03-21 13:38 @610

Re: Ayuda con regex

Notapor explorer » 2013-08-21 16:11 @716

Pero, ¿cuál es la regla? ¿Eliminar la última suma si consiste en tres comillas simples?
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


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot] y 12 invitados