Expresion regular en Perl

Iniciado por bdoX, 9 Enero 2012, 23:39 PM

0 Miembros y 1 Visitante están viendo este tema.

bdoX

Veo que nunca supiste lo que yo queria resolver. Yo quiero validar la entrada de solo combinaciones en {a, b}, y me diga que pertenezca al lenguaje. Si aparece al menos una letras que no sean {a, b} o vacio, automaticamente quiero que me diga que no pertenece al lenguaje.

yo quiero esto

"3}p2aa-0" --> No pertenece al lenguaje
"abababababaaabbaababa" ----> si pertenece al lenguaje

saludos!!

D4RIO

No entiendo porqué tanta complicación. Si me permites la intromisión, un alfabeto {a,b} (siendo {a,b} un conjunto de 2 elementos) debería reconocer como válidas:


  • aa
  • ab
  • bb
  • abababb
  • bbabbb

Y cualquier palabra que se componga de SOLO 'a' y 'b'. Si deseas que la cadena vacía sea inválida, entonces tu expresión es tan simple como "/^[a|b]+$/", es decir: Los elementos a y b son los únicos válidos de principio a fin, y al menos debe existir un elemento válido.
Si deseas considerar espacios es otra cosa, pero para ver SOLO palabras compuestas por las letras "a" y "b" sería:

Código (perl) [Seleccionar]
#!/usr/bin/env perl

use strict;

die "sin parametros\n" unless (@ARGV);

print "el lenguaje se compone de 'a' y 'b'\n";

for (@ARGV) {
    if (/^[a|b]+$/) {
        print "'$_' pretenece al lenguaje\n";
    }
    else {
        print "'$_' NO pretenece al lenguaje\n";
    }
}

exit (0);


Llamalo con las palabras que desees como parámetros, agrega la cadena vacía, usa un arreglo tuyo en lugar de ARGV, como sea.

Saludos
OpenBSDFreeBSD

~ Yoya ~

Si ps, yo tampoco entiendo tanto complicación, supongo porque no ha explicado bien que es lo que quieres hacer.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

D4RIO

Por cierto, me permito hacer otra aclaración que nadie hizo. El operador (función) m (match) de Perl, es TOTALMENTE INNECESARIO en las expresiones que pegaron antes.

Usaría el operador de matching si fuera a delimitar la expresión de otra forma, por ejemplo:

m#^[a|b]+$#
m:^[a|b]+$:
m%^[a|b]+$%

En caso de usar slashes ( / ), el operador m no es necesario, porque está implícito. Es lo mismo ponerlo que no hacerlo.

~ Yoya ~: Tu expresión tampoco matchea lo que dices que matchearía, o lo que debería. La expresión m/^[a-z\ñ]+$/i lo que hace es devolver verdadero (1) si la cadena está conformada con caracteres de la 'a' a la 'z' incluyendo la 'ñ', tanto mayúsculas como minúsculas.

La otra expresión:
Código (perl) [Seleccionar]
if ($nombre =~ m/[^ab]/ | $nombre =~ m/^$/) lo que hace es verificar que la cadena EMPIECE por 'a' o 'b', pero dará como válido cosas como 'astilla' o 'barco'.

Saludos
OpenBSDFreeBSD

bdoX

#14
Cita de: xD4RIOx en 11 Enero 2012, 17:41 PM

La otra expresión:
Código (perl) [Seleccionar]
if ($nombre =~ m/[^ab]/ | $nombre =~ m/^$/) lo que hace es verificar que la cadena EMPIECE por 'a' o 'b', pero dará como válido cosas como 'astilla' o 'barco'.

Saludos


C:\>validar.pl
Ingrese nombre de usuario: barco
No pertenece al lenguaje

C:\>validar.pl
Ingrese nombre de usuario: astilla
No pertenece al lenguaje

C:\>


Lo que dice acá if ($nombre =~ m/[^ab]/ | $nombre =~ m/^$/) es que si encuentra una letra que sea diferende de 'a' ó 'b', o si hay una cadena vacia, que entre al if() de lo contrario, que entre al else, entrando al else me dice que si pertenece al lenguaje. Y los resultados con w = "astilla" y w = "barco", no es cierto de que me da como si perteneciera al lenguaje.

Y lo de la m, ya habia comentado de que no era necesario usarlo, pero no sabia porque, gracias por aclarar eso.

PD:

[^\@ \t] busca cualquier carácter que no sea un @, una tabulación o un espacio. Hay que señalar que \ delante de @ es opcional, ya que el símbolo @ no tiene significados particulares en este contexto, pero funciona también con \@

[^]    indica un conjunto de caracteres que no pueden aparecer

Fuente:

     URL

     URL



saludos!

D4RIO

Cierto, lo confundí con /^[ab]/, lo extraño es que hice una prueba rápida para ver si me equivocaba, y:

$ perl ab.pl asas barco bola asta baba
el lenguaje se compone de 'a' y 'b'
'asas' pretenece al lenguaje
'barco' pretenece al lenguaje
'bola' pretenece al lenguaje
'asta' pretenece al lenguaje
'baba' NO pretenece al lenguaje


Parece como si hubiera puesto /^[^ab]$/... debe ser porque estoy en cygwin. Cuando llegue a mi casa verifico si en Linux tengo el mismo problema.

PD: La fuente por excelencia para hablar de expresiónes de Perl es el perlretut, la documentación oficial de perldoc. La referencia a esto sería esta

Saludos
OpenBSDFreeBSD

bdoX

Cita de: xD4RIOx en 11 Enero 2012, 20:44 PM
PD: La fuente por excelencia para hablar de expresiónes de Perl es el perlretut, la documentación oficial de perldoc. La referencia a esto sería esta

Saludos

Gracias por el dato.

saludOS!

explorer

#17
Sería algo así:
Código (perl) [Seleccionar]
#!/usr/bin/perl
use 5.010;
use utf8;
use strict;

print "Ingrese nombre de usuario: ";
my $nombre = <>;
chomp $nombre ;

if ($nombre =~ /^[ab]+$/i) {
   say 'Sí pertenece';
}
else {
   say 'No pertenece';
}