Foros del Web » Soporte técnico » Sistemas Operativos »

Desafío: Expresión regular

Estas en el tema de Desafío: Expresión regular en el foro de Sistemas Operativos en Foros del Web. Bien, ahora que ya he captado vuestra atención :) , os explico: Con motivo de que he desactivado el RegisterGlobals de mi PHP, pues tengo ...
  #1 (permalink)  
Antiguo 24/07/2002, 03:07
Avatar de lical
Colaborador
 
Fecha de Ingreso: diciembre-2001
Ubicación: $PWD
Mensajes: 1.267
Antigüedad: 23 años, 6 meses
Puntos: 0
Desafío: Expresión regular

Bien, ahora que ya he captado vuestra atención :) , os explico:

Con motivo de que he desactivado el RegisterGlobals de mi PHP, pues tengo un cuestionario en el que tengo que cambiar el nombre de algunas variables... podría hacerlo a mano, pero digamos que es extenso, y además esta era una estupenda oportunidad para practicar las expresiones regulares :)

Lo primero es que no estoy seguro de cómo se representa un guión bajo. Las variables tienen nombres:

de $question_1 a $question_10

de $question_11_1 a $question_11_5

y de $question_12_1 a $question_12_5

Obviamente, hay que transformarlos en $_POST['question_x'] o bien $_POST['question_xx_x]' según corresponda.

Además, tener en cuenta condiciones como que el nombre de la variable puede ir pegado a cosas como un paréntesis de cerrar -)-, un punto -.- o un espacio.

Yo había pensado en algo como esto:


Código:
 cat form.php | sed -e 's/\$question_\([0-9]*[(_[0-9]|[^_])][^(\.|\)| )]\)/\$_POST['question_\1']/g' >
form.php.1

Además de no saber lo del guión bajo -_-, otro problema que tengo es que agrupamos un grupo con \( \) pero es que quiero que no esté seguido de un paréntesis, por lo que ya estoy poniendo un \) que puede confundir al sed....


No hay excusas, no hay dolor! A darle al coco muchachos que yo no consigo dar con la fómula!!!


Ahora en serio, muchas gracias por vuestro tiempo.



Un saludo,
  #2 (permalink)  
Antiguo 24/07/2002, 10:03
 
Fecha de Ingreso: noviembre-2001
Mensajes: 415
Antigüedad: 23 años, 8 meses
Puntos: 0
Re: Desafío: Expresión regular

hmmm sed


hmmmmm sed

AH!!!! PERL ;)

Código:
cat a | perl -pe "s/n\_11\_1/n\_11\_5/;s/n\_12\_1/n\_12\_5/;s/n\_1\'/n\_10\'/"

;)
  #3 (permalink)  
Antiguo 24/07/2002, 13:02
Avatar de lical
Colaborador
 
Fecha de Ingreso: diciembre-2001
Ubicación: $PWD
Mensajes: 1.267
Antigüedad: 23 años, 6 meses
Puntos: 0
Re: Desafío: Expresión regular

Amigo MMontes, yo con el shell scripting me aclaro algo, pero lo que es Perl... no tengo ni idea, o sea que explícame qué es lo que hace la línea que me has puesto.


Un saludo,

<hr width=80% align=center>lical -> Usuario registrado de Linux #254225<br><br>¿Piensas que el software puede ser algo más?
[B]<a href="http://www.zonasiete.org/" target="_blank">www.zonasiete.org</a>
Acercando el proyecto GNU/Linux a todos.</b
  #4 (permalink)  
Antiguo 25/07/2002, 09:02
 
Fecha de Ingreso: noviembre-2001
Mensajes: 415
Antigüedad: 23 años, 8 meses
Puntos: 0
Re: Desafío: Expresión regular

Bueno como vi que la expreg que estabas usando era de linea de comandos, supuse que no tendrias problema en usar el perl que tambien tiene buenas expresiones regulares.

perl es un &quot;interprete&quot; (entre comillas, porque no es tan asi), que te permite ejecutar código desde la linea de comandos.
haciendo:
Código:
# perl -e 'print &quot;hola mundo\n&quot;;'
se ejecuta el codigo correspondiente.

el parámetro -p hace que se itere leyendo el STDIN. Se emula -de cierta manera- el comportamiento de sed, aunque se pueden usar bloques BEGIN y END para ejecutar ANTES del proceso de compilacion, al igual que en awk.

En perl existe una variable ($_) que toma su valor segun el contexto. En realidad son 3, $_, @_ y %_ (una variable escalar, un array y un array asociativo).

Para ilustrar como &quot;funciona&quot; esa variable te muestro el siguiente ejemplo.

Para imprimir numeros del 1 al 10, se puede hacer:
Código:
foreach my $numero(1..10) { 
  print $numero;
}
el my $numero, en realidad lo que hace es asignar la variable contextual $_ a $numero.
perfectamente puedo hacer:
Código:
foreach (1..10) {
  print $_;
}
como siempre hay una variable contextual del caso (SIEMPRE), se puede obviar la variable:
Código:
foreach (1..10) { print; }
y en una ultima optimización, en perl, si despues de una instrucción se termina un bloque, podemos obviar el &quot;;&quot;:
Código:
foreach (1..10) { print }
Entonces lo que hago es basicamente aplicarle una expresión regular al contenido de STDIN.

haciendo:
Código:
cat archivo | perl -pe '$_ = $linea; $linea =~ s/Hoy/Ayer/g; print $linea';
por esas cosas matemágicas de la vida, puedo achicarlo a:
Código:
cat archivo | perl -pe 's/Hoy/Ayer/'
que es lo que hago en la linea que te pase antes.

Eso si, ni pense en la expresión regular, son 3 lineas distintas, 3 expresiones regulares diferentes. Pero el resultado es el mismo :P

Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:17.