• Publicidad

Uso de $1 y $2 al realizar un match

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

Uso de $1 y $2 al realizar un match

Notapor sebas » 2012-11-30 04:44 @239

Hola a todos,

Recurro a vuestra sapiencia una vez más porque aunque tengo una posible solución alternativa me gustaría usar expresiones regulares para resolver este problema.

Estoy intentando remplazar en un archivo Java ciertas llamadas a métodos. Estas llamadas tienen una sintaxis similar a la siguiente:

Objeto.metodo(parametro1, "parametro2", null);

Dado que la sintaxis de Java no es muy estricta permite bastantes variantes por lo que si pudiera usar expresiones regulares me permitiría cubrir todas las posibles casuísticas. Bueno, al lio, la idea es recoger el contenido entre paréntesis y de ahí obtener el que viene entre comillas:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ($contenido =~ /\bObjeto\b(.|\n)*?\bmetodo\b(.|\n)*?\)/i)
  2. {
  3.  
  4. my $contentBrackets = $2;
  5.  
  6. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


El problema es que con el $2 no consigo capturar el texto que hay entre método y el paréntesis final, y aunque el if() e incluso un replace encuentran el texto y lo remplazan lo que no consigo es extraerlo para tratarlo.

Sé que con un conocimiento mejor de las expresiones regulares podría sacarlo pero no consigo sacar nada con todas las pruebas realizadas.

Gracias de antemano.
sebas
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-11-06 11:47 @532

Publicidad

Re: Uso de $1 y $2 al realizar un match.

Notapor sebas » 2012-11-30 08:25 @392

La solución es envolverlo en parentesis:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $contenido =~ /\bObjeto\.metodo\(((.|\n)*?)\)/i;
  2. my $contentBrackets = $1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Un saludo
sebas
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-11-06 11:47 @532

Re: Uso de $1 y $2 al realizar un match

Notapor explorer » 2012-11-30 09:07 @421

Utilizas los paréntesis de tres formas distintas:
  • literales
  • agrupación
  • captura

El problema está en los de agrupación, que, por defecto, también se comportan como de captura, por lo que influyen en la numeración de las variables $1, $2, etc.

Una solución es indicar que esos paréntesis no capturan: (?:.|\n)

Otra cosa... fíjate que estás usando un '.' tanto para coincidir con el '.' del método Java, como con los posibles espacios en blanco que hubiera delante del método.

Me atrevo a poner la mía: /\w+ \s* [.] \s* \w+ \s* \( (.*?) \) \s* [;]/msx
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: Uso de $1 y $2 al realizar un match

Notapor sebas » 2012-12-03 02:58 @165

Buenas, explorer, gracias por la ayuda, la verdad que así la expresión queda mucho más legible. Entiendo que el \w+ en el caso del objeto y el método tendré que poner el nombre para que no realice match con todas las llamadas a métodos del código (dado que solo quiero remplazar ciertas llamadas a un método en concreto), si no es así ruego me lo indiques.

Por ahora dejo así la expresión:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. /Objeto \s* [.] \s* metodo \s* \( (.*?) \) \s* [;]/msx
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Tengo dudas respecto a los modificadores:

m: Trata la cadena como multilínea, es decir, que los ^ y $ hacen match al comenzar cualquier línea, pero en la expresión no hay ni ^ ni $, ¿es necesario?

s: Single line, el \s captura también los saltos de línea, si no es esta la razón ruego me lo indiques

x: En este caso entiendo que se usa para ignorar los espacios de la expresión para hacerla más legible

Gracias de nuevo por la ayuda.
sebas
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-11-06 11:47 @532

Re: Uso de $1 y $2 al realizar un match

Notapor explorer » 2012-12-03 12:39 @568

sebas escribiste:Buenas, explorer, gracias por la ayuda, la verdad que así la expresión queda mucho más legible. Entiendo que el \w+ en el caso del objeto y el método tendré que poner el nombre para que no realice match con todas las llamadas a métodos del código (dado que solo quiero remplazar ciertas llamadas a un método en concreto), si no es así ruego me lo indiques.
Pues sí, así está bien. Lo que puedes hacer es usar variables en los nombres de la clase y el método, y así puedes programar búsquedas en un conjunto o combinación de clases/paquetes.

sebas escribiste:m: Trata la cadena como multilínea, es decir, que los ^ y $ hacen match al comenzar cualquier línea, pero en la expresión no hay ni ^ ni $, ¿es necesario?
Yo he supuesto que la definición de una clase puede ocurrir en cualquier parte del código, así que por eso no he puesto las anclas de comienzo y final de sentencia. Lo importante es la presencia -opcional- de los espacios en blanco (\s*) que incluyen a los caracteres de avance de línea.

sebas escribiste:s: Single line, el \s captura también los saltos de línea, si no es esta la razón ruego me lo indiques
Esta opción solo afecta al comportamiento del comodín '.', para que coincida con los finales de línea. En la expresión regular solo aparece en la parte de los argumentos al método, como una indicación de que ahí permitimos cualquier cosa hasta justo antes del siguiente paréntesis, por lo que también estamos admitiendo el caso de un método con los argumentos escritos en distintas líneas.
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: Uso de $1 y $2 al realizar un match

Notapor sebas » 2012-12-04 02:13 @134

Perfecto, como siempre, muchísimas gracias :D
sebas
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-11-06 11:47 @532


Volver a Básico

¿Quién está conectado?

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