Perl - Expresión regular

 
Vista:

Expresión regular

Publicado por iGNASI85 (3 intervenciones) el 05/12/2006 19:41:14
Buenas, tengo una duda a la hora de tratar una expresión regular.

El 4 argumento de mi programa en perl es una cadena como esta--> 1:2:3

Donde el mínimo de esta cadena es un número cualquiera de 1 a 11 y el máximo es que sean los 11 números, es decir:

1:2:3:4:5:6:7:8:9:10:11

Donde el orden no importa.

Para tratar esta expresión regular uso:

if($ARGV[4]=~ m/((\d{1,2})(\:)(\d{1,2}))*/){
print "$1\t$2\t$3\t$4\t$5\n";
}else {
print "Argumentos mal introducidos\n";
}

En principio pongo el * a final del matching para indicar que puede que haya 0 o más cadenas del tipo num:num. Al imprimir los argumentos $5 y posteriores para una entrada del tipo (1:2:3:4:5:6:7:8:9:10:11), no me imprime nada, están vacíos... solo me coge expresiones de tipo num:num.

Alguna idea?

Muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Expresión regular

Publicado por JoaquinFerrero (25 intervenciones) el 07/12/2006 16:56:43
Pero lo importante es: ¿qué es lo que quieres obtener? ¿Los conjuntos num:num? ¿sólo los num? ¿los num:num tomados de dos en dos o el segundo num es el primer num de la siguiente captura? ¿cómo los quieres almacenar? ¿cómo los vas a tratar después?

Según lo que respondas se me ocurre una solución distinta...

Si lo único que quieres es obtener los números que están separados por ':', pues eso es muy fácil:

@numeros = split(':', $ARGV[4]);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Expresión regular

Publicado por iGNASI85 (3 intervenciones) el 07/12/2006 17:20:22
Si, el split ya lo había hecho para "pillar" de uno en uno los números.. de hecho hice esto:

@heur=split(/:/,$ARGV[$index+1]);
foreach $i(0..10){
$heuristics[$i]=@heur[$i];
}

Mi problema está en la expresión regular, ya que necesito que no me acepte cadenas del tipo:

1::2
2:

y que el límite sean 11 números, es decir nº:nº:nº:nº:nº:nº:nº:nº:nº:nº:nº donde nº va de 1 a 11.

Gracias y perdona mi poca claridad en expresar el problema.

Gracias d nuevo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Expresión regular

Publicado por JoaquinFerrero (25 intervenciones) el 08/12/2006 14:14:29
La primera comprobación, de saber si está bien escrito, puedes hacerla con esta expresión regular:

$entrada = shift;
if ( $entrada =~ /:(\D|$)/ ) {
print "no correcto";
exit 1;
}

Lo que hacemos en la expresión regular es buscar alguna combinación de un ':' seguido del fin de línea ($) o de cualquier otra cosa que no sea un dígito (\D).

Para luego comprobar que el límite sean 11 números, se puede primero extraerlos:

@entrada = split(':', $entrada);
if ( @entrada > 11 ) {
print "Demasiados números";
exit 1;
}

Pero entonces... podemos obviar la expresión regular...

Si consideramos que el usuario nos puede pasar la cadena '1::3:4', que está mal escrita, pero podemos admitirla porque hay 3 números separados con ':', podemos hacer:

@entrada = grep { /\d+/ } split(':', $entrada);

con lo que @entrada tendrá almacenados todos los números pasados por el usuario, sin importar si lo escribió bien o no.

Te recomiendo el foro de Perl en Español. Tiene más medios para postear código, que este.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Expresión regular

Publicado por iGNASI85 (3 intervenciones) el 08/12/2006 16:20:26
Muchas gracias por tu respuesta tan completa.

Seguiré tus consejos.

Gracias de nuevo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar