• Publicidad

Encontrar subcadena y modificar cadena de caracteres

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

Encontrar subcadena y modificar cadena de caracteres

Notapor mulambo » 2010-04-12 14:31 @647

Hola, tengo una duda en cuanto al uso de buscadores de expresiones regulares, ya que soy nuevo usando Perl. He construido un string con una serie de comandos y pueden existir valores NULL. En ese caso quiero eliminar ese valor y su respectiva variable, me explico un poco:

STRING:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
JasssnaNrtProfileName:parametro1
JasssnaNumberOfDigits: parametro2
JasssnaCNumberPrefix:parametro3
JasssnaNatureOfAddressIndicatorForCNumber: NULL
JasssnaNatureOfAddressIndicatorReservedValue: parametro5
JasssnaNextProfile:NULL
JasssnaUnsuccessfulProfile: parametro7
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


En este caso cuando encuentro la palabra NULL el string debería quedar así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
JasssnaNrtProfileName:parametro1
JasssnaNumberOfDigits: parametro2
JasssnaCNumberPrefix:parametro3

JasssnaNatureOfAddressIndicatorReservedValue: parametro5

JasssnaUnsuccessfulProfile: parametro7
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Eliminando de esa manera donde dice NULL. ¿Cómo puedo establecer el patrón de búsqueda y después que consiga la palabra a eliminar retornar en el string y borrar la palabra que está antes de ésta?

Gracias de antemano.
mulambo
Perlero nuevo
Perlero nuevo
 
Mensajes: 22
Registrado: 2007-08-14 10:06 @462

Publicidad

Re: Encontrar subcadena y modificar cadena de caracteres

Notapor explorer » 2010-04-12 15:42 @696

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. my $cadena = <<EOS;
  7. JasssnaNrtProfileName:parametro1
  8. JasssnaNumberOfDigits: parametro2
  9. JasssnaCNumberPrefix:parametro3
  10. JasssnaNatureOfAddressIndicatorForCNumber: NULL
  11. JasssnaNatureOfAddressIndicatorReservedValue: parametro5
  12. JasssnaNextProfile:NULL
  13. JasssnaUnsuccessfulProfile: parametro7
  14. EOS
  15.  
  16. print $cadena . '-'x 50 . "\n";
  17.  
  18. $cadena =~ s/^.+?NULL//mg;
  19.  
  20. print "$cadena\n";
  21.  
  22. __END__
  23. JasssnaNrtProfileName:parametro1
  24. JasssnaNumberOfDigits: parametro2
  25. JasssnaCNumberPrefix:parametro3
  26. JasssnaNatureOfAddressIndicatorForCNumber: NULL
  27. JasssnaNatureOfAddressIndicatorReservedValue: parametro5
  28. JasssnaNextProfile:NULL
  29. JasssnaUnsuccessfulProfile: parametro7
  30. --------------------------------------------------
  31. JasssnaNrtProfileName:parametro1
  32. JasssnaNumberOfDigits: parametro2
  33. JasssnaCNumberPrefix:parametro3
  34.  
  35. JasssnaNatureOfAddressIndicatorReservedValue: parametro5
  36.  
  37. JasssnaUnsuccessfulProfile: parametro7
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

La opción /m indica que $cadena está compuesta por varias líneas, por lo que '^' y '$' cambian de significado: en lugar de indicar inicio y fin de la cadena, se refieren al inicio y fin de las cadenas que hay dentro de toda la $cadena.
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: Encontrar subcadena y modificar cadena de caracteres

Notapor mulambo » 2010-04-13 08:21 @389

Muchas gracias, explorer, perfectamente pude resolver el problema con tu ejemplo.

Una duda: //mg ¿qué significa?

¡Gracias de antemano!
mulambo
Perlero nuevo
Perlero nuevo
 
Mensajes: 22
Registrado: 2007-08-14 10:06 @462

Re: Encontrar subcadena y modificar cadena de caracteres

Notapor explorer » 2010-04-13 10:40 @486

s/^.+?NULL//mg es un operador de sustitución. En la primera parte hay una expresión regular que busca por un comienzo de línea (^) hasta llegar a la primera palabra NULL que encuentre. En ese caso, sustituye todo lo encontrado por nada (//). Esto lo repite varias veces, a lo largo de toda la cadena (/g). Y lo que hace /m ya lo he explicado en el mensaje anterior.
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: Encontrar subcadena y modificar cadena de caracteres

Notapor mulambo » 2010-04-20 10:38 @484

Muchas gracias por la explicación, explorer.

Ahora tengo otra duda: si en el caso que desee eliminar el doble retorno de carro que tengo en la expresion resultante:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
JasssnaNrtProfileName:parametro1
JasssnaNumberOfDigits: parametro2
JasssnaCNumberPrefix:parametro3

JasssnaNatureOfAddressIndicatorReservedValue: parametro5

JasssnaUnsuccessfulProfile: parametro7
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¿En ese caso debería colocar la siguiente expresión? No me ha resultado...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$cadena =~ s/^.+?/\n/\n//mg;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
mulambo
Perlero nuevo
Perlero nuevo
 
Mensajes: 22
Registrado: 2007-08-14 10:06 @462

Re: Encontrar subcadena y modificar cadena de caracteres

Notapor explorer » 2010-04-20 10:52 @494

La expresión regular puede ser, sencillamente, lo que queremos: sustituir las apariciones de dos o más "\n", en uno solo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. my $cadena = << 'TEXTO';
  7. JasssnaNrtProfileName:parametro1
  8. JasssnaNumberOfDigits: parametro2
  9. JasssnaCNumberPrefix:parametro3
  10.  
  11. JasssnaNatureOfAddressIndicatorReservedValue: parametro5
  12.  
  13. JasssnaUnsuccessfulProfile: parametro7
  14. TEXTO
  15.  
  16. print $cadena;
  17.  
  18. print '=' x 40, "\n";
  19.  
  20. $cadena =~ s/\n\n+/\n/g;
  21.  
  22. print $cadena;
  23.  
  24. __END__
  25. JasssnaNrtProfileName:parametro1
  26. JasssnaNumberOfDigits: parametro2
  27. JasssnaCNumberPrefix:parametro3
  28.  
  29. JasssnaNatureOfAddressIndicatorReservedValue: parametro5
  30.  
  31. JasssnaUnsuccessfulProfile: parametro7
  32. ========================================
  33. JasssnaNrtProfileName:parametro1
  34. JasssnaNumberOfDigits: parametro2
  35. JasssnaCNumberPrefix:parametro3
  36. JasssnaNatureOfAddressIndicatorReservedValue: parametro5
  37. JasssnaUnsuccessfulProfile: parametro7
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

De todas maneras, se pueden poner los dos pasos -búsqueda de NULL y eliminación de líneas en blanco-, en una sola expresión regular:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. my $cadena = <<EOS;
  7. JasssnaNrtProfileName:parametro1
  8. JasssnaNumberOfDigits: parametro2
  9. JasssnaCNumberPrefix:parametro3
  10. JasssnaNatureOfAddressIndicatorForCNumber: NULL
  11. JasssnaNatureOfAddressIndicatorReservedValue: parametro5
  12. JasssnaNextProfile:NULL
  13. JasssnaUnsuccessfulProfile: parametro7
  14. EOS
  15.  
  16. print $cadena;
  17.  
  18. print '='x 50 . "\n";
  19.  
  20. $cadena =~ s/^.+?NULL\s*//mg;
  21.  
  22. print $cadena;
  23.  
  24. __END__
  25. JasssnaNrtProfileName:parametro1
  26. JasssnaNumberOfDigits: parametro2
  27. JasssnaCNumberPrefix:parametro3
  28. JasssnaNatureOfAddressIndicatorForCNumber: NULL
  29. JasssnaNatureOfAddressIndicatorReservedValue: parametro5
  30. JasssnaNextProfile:NULL
  31. JasssnaUnsuccessfulProfile: parametro7
  32. ==================================================
  33. JasssnaNrtProfileName:parametro1
  34. JasssnaNumberOfDigits: parametro2
  35. JasssnaCNumberPrefix:parametro3
  36. JasssnaNatureOfAddressIndicatorReservedValue: parametro5
  37. JasssnaUnsuccessfulProfile: parametro7
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

En este caso, incluimos todos los espacios (\s*) que sigan a NULL como candidatos a ser eliminados. Los retornos de carro también son considerados espacios en blanco.
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: No hay usuarios registrados visitando el Foro y 47 invitados