elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
29 Mayo 2012, 09:09  


Tema destacado: [Overclocking] Récords de overclock del foro

+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting (Moderadores: Novlucker, Leo Gutiérrez., EleKtro H@cker)
| | |-+  Expresion regular en Perl
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Expresion regular en Perl  (Leído 1,108 veces)
bdoX

Desconectado Desconectado

Mensajes: 31



Ver Perfil
Expresion regular en Perl
« en: 9 Enero 2012, 23:39 »

Hola a todos:

Les cuento mi duda, pasa que quiero validar una espresion regular  y quiero que solo me reconozca el string en el alfabeto= {a, b}.

acá dejo el code. No se en que estoy fallando.

Código
print "Ingrese nombre de usuario: ";
$nombre=<STDIN>;
chomp($nombre);
 
if ($nombre =~ m/[c-z]/ | $nombre !~ m/\w/ | $nombre =~ m/[0-9]/)
{
print "No pertenece al lenguaje\n";
}
else
{
print "Si pertenece\n";
}
 

Con esto solo me acepta el alfabeto [a,b] + caracteres especiales como por ejemplo +, - {. } !, --. Pero eso no es lo que quiero. Ayuda please!

Código
print "Ingrese nombre de usuario: ";
$nombre=<STDIN>;
chomp($nombre);
 
if ($nombre =~ m/[c-z]/ | $nombre =~ /m[0-9]/)
{
print "No pertenece al lenguaje\n";
}
else
{
print "Si pertenece\n";
}
 


« Última modificación: 10 Enero 2012, 23:24 por Leo Gutiérrez. » En línea

~ Yoya ~
Wiki

Desconectado Desconectado

Mensajes: 954



Ver Perfil
Re: Espresion regular en Perl
« Respuesta #1 en: 10 Enero 2012, 00:17 »

Analiza el script que acabo de hacer, compararlo y luego pregunta cualquier cosa.

Código
#!/usr/bin/perl
 
use POSIX qw(locale_h);
 
 
=pod
En este caso es mucho mejor utilizar chomp, ya que este borra el salto de linea al final del string
chop borra el ultimo caracter al final del string....
 
 
Establesco el locale para el script, para que me tome la letra ñ como parte del alfabeto....
=cut

 
 
 
setlocale(LC_ALL, 'es_DO.ISO-8859-1');
 
my $nombre = <>;
 
chomp($nombre); #Borro el salto de linea del final del string si existe
 
 
 
if($nombre =~ m/[a-z]/i) {
print "Si\n";
 
}


En línea

bdoX

Desconectado Desconectado

Mensajes: 31



Ver Perfil
Re: Espresion regular en Perl
« Respuesta #2 en: 10 Enero 2012, 02:45 »

Hola ~ Yoya ~:

Gracias por responder, solo entiendo esta parte de tu code.

Código:
my $nombre = <>;
 
chomp($nombre); #Borro el salto de linea del final del string si existe
 
if($nombre =~ m/[a-z]/i) {
print "Si\n";

La verdad es que no se que tan importante colocarle la m if($nombre =~ m/[a-z]/i) , porque sin él, me funciona igual. A lo mejor es para hacerlo mas portable. (Estoy bajo windows)

No se si me explique bien, pero voy a dar unos ejemplos que lo quiero.

Código
string = "abababababababba"; # deberia tomarlo
string = "ababaaabbb+.-aba"; # No deberia tomarlo
string = "ok23iaajij3o+i23jaabv"; #No deberia tomarlo
string = "a"; #deberia tomarlo;
string = "b"; #deberia tomarlo;
string = " "; #No deberia tomarlo;
string = ""; #No deberia tomarlo;
string = "+"; #No deberia tomarlo;
string = "a+b"; #No deberia tomarlo;
#... etc
 
« Última modificación: 10 Enero 2012, 02:50 por bdoX » En línea

Shell Root


Desconectado Desconectado

Mensajes: 2.456


Alex Jurado


Ver Perfil WWW
Re: Espresion regular en Perl
« Respuesta #3 en: 10 Enero 2012, 03:02 »

m//
Este operador también conocido como de cotejo, se utiliza para localizar alguna expresión dentro de una cadena de texto o string. Si la expresión es verdadera entonces se regresará un 1.

:http://perlenespanol.com/tutoriales/expresiones_regulares/expresiones_regulares_las_bases.html
En línea

---
bdoX

Desconectado Desconectado

Mensajes: 31



Ver Perfil
Re: Espresion regular en Perl
« Respuesta #4 en: 10 Enero 2012, 03:15 »

Para no salir del hilo, modifiqué lo del operador m// arriba. También modifique lo de chop(), por chomp(), pero los resultados son iguales


EDITADO

solucionado, acá dejo el code, era mas facil de lo que me esperaba jajajaj.

Código
print "Ingrese nombre de usuario: ";
$nombre=<STDIN>;
chomp($nombre);
 
#analiso si la cadena no contiene a,b y analiso si la cadena es vacia
if ($nombre =~ m/[^ab]/ | $nombre =~ m/^$/)
{
   print "No pertenece al lenguaje\n";
}
else
{
   print "Si pertenece\n";
}
 

Gracias por su ayuda, saludos!
« Última modificación: 10 Enero 2012, 03:48 por bdoX » En línea

~ Yoya ~
Wiki

Desconectado Desconectado

Mensajes: 954



Ver Perfil
Re: Espresion regular en Perl
« Respuesta #5 en: 10 Enero 2012, 15:39 »

La expresión regular que estas usando es valida solo si no existe el carácter a o b, en el string. Ej:

Citar
[yoya@Fedora Escritorio]$ perl a.pl
Ingrese nombre de usuario: c
No pertenece al lenguaje
[yoya@Fedora Escritorio]$ perl a.pl
Ingrese nombre de usuario: a
Si pertenece
[yoya@Fedora Escritorio]$

Código
#!/usr/bin/perl
 
print "Ingrese nombre de usuario: ";
$nombre=<STDIN>;
chomp($nombre);
 
#analiso si la cadena no contiene a,b y analiso si la cadena es vacia
if($nombre =~ m/^[a-z\ñ]+$/i) {
print 'Si pertenece', "\n";
}else{
print 'No pertenece', "\n";
}
 

Con esta compruebo que en la cadena entera debe existir solo las letras del alfabeto, desde el inicio al final.

Saludos.
En línea

bdoX

Desconectado Desconectado

Mensajes: 31



Ver Perfil
Re: Espresion regular en Perl
« Respuesta #6 en: 10 Enero 2012, 17:05 »

La expresión regular que estas usando es valida solo si no existe el carácter a o b, en el string. Ej:

Código
#!/usr/bin/perl
 
print "Ingrese nombre de usuario: ";
$nombre=<STDIN>;
chomp($nombre);
 
#analiso si la cadena no contiene a,b y analiso si la cadena es vacia
if($nombre =~ m/^[a-z\ñ]+$/i) {
print 'Si pertenece', "\n";
}else{
print 'No pertenece', "\n";
}
 

Con esta compruebo que en la cadena entera debe existir solo las letras del alfabeto, desde el inicio al final.

Saludos.

Con tu code, me aparece esto:

Código:
C:\>tucode.pl
Ingrese nombre de usuario: c
Si pertenece

C:\>tucode.pl
Ingrese nombre de usuario: a
Si pertenece

C:\>

Como te darás cuenta, estoy bajo windows. No me aparece como a ti

Código:
[yoya@Fedora Escritorio]$ perl a.pl
Ingrese nombre de usuario: c
No pertenece al lenguaje
[yoya@Fedora Escritorio]$ perl a.pl
Ingrese nombre de usuario: a
Si pertenece
[yoya@Fedora Escritorio]$

Por eso no entiendo lo que dices. Lo que hice anteriormente me valida bien el string en el alfabeto {a,b}.

Es solo una validacion, para resolver este tipo de expresiones regulares

"L = {w|w contiene las substring aa o bb pero no ambas}"
"L = {w|w no hay tres a′s consecutivas}"
"L = {w|w tiene numero par de a’s}" // ese no se me ocurre com hacerlo

saludos!
« Última modificación: 10 Enero 2012, 17:45 por bdoX » En línea

~ Yoya ~
Wiki

Desconectado Desconectado

Mensajes: 954



Ver Perfil
Re: Espresion regular en Perl
« Respuesta #7 en: 10 Enero 2012, 23:20 »

Esta parte

Código:
[yoya@Fedora Escritorio]$ perl a.pl
Ingrese nombre de usuario: c
No pertenece al lenguaje
[yoya@Fedora Escritorio]$ perl a.pl
Ingrese nombre de usuario: a
Si pertenece
[yoya@Fedora Escritorio]$

Fue con tu código, creo que el tema esta volviendo complicado cuando el problema es muy simple.
En línea

bdoX

Desconectado Desconectado

Mensajes: 31



Ver Perfil
Re: Espresion regular en Perl
« Respuesta #8 en: 10 Enero 2012, 23:28 »

Esta parte

Código:
[yoya@Fedora Escritorio]$ perl a.pl
Ingrese nombre de usuario: c
No pertenece al lenguaje
[yoya@Fedora Escritorio]$ perl a.pl
Ingrese nombre de usuario: a
Si pertenece
[yoya@Fedora Escritorio]$

Fue con tu código, creo que el tema esta volviendo complicado cuando el problema es muy simple.

Segun yo, los resultados que te da son buenos, con tu codigo me dan resultados que no espero tener. Aun sigo sin entenderte.

Bueno, segun yo, ya está solucionado mi duda.

Si aun crees que está malo mi codigo, dame un string en el alfabeto donde el programa se caiga.

saludos!

« Última modificación: 10 Enero 2012, 23:34 por bdoX » En línea

~ Yoya ~
Wiki

Desconectado Desconectado

Mensajes: 954



Ver Perfil
Re: Expresion regular en Perl
« Respuesta #9 en: 10 Enero 2012, 23:59 »

Código
#!/usr/bin/perl
 
 
@nombres = ('juan','JOse', 'Luan', '565656aaa', '%_$__', 'Raa', 'b');
 
 
 
print '----------Yoya codigo', "\n";
foreach $nombre (@nombres) {
 
#analiso si la cadena no contiene a,b y analiso si la cadena es vacia
if($nombre =~ m/^[a-z\ñ]+$/i) {
print "$nombre -> Si pertenece\n";
}else{
print "$nombre -> No pertenece\n";
}
 
}
 
print "\n----------bdoX codigo\n";
foreach $nombre (@nombres) {
 
if ($nombre =~ m/[^ab]/ | $nombre =~ m/^$/)
{
   print "$nombre -> No pertenece al lenguaje\n";
}
else
{
   print "$nombre -> Si pertenece\n";
}
}
 

Código:
[yoya@Fedora Escritorio]$ perl a.pl
----------Yoya codigo
juan -> Si pertenece
JOse -> Si pertenece
Luan -> Si pertenece
565656aaa -> No pertenece
%_$__ -> No pertenece
Raa -> Si pertenece
b -> Si pertenece

----------bdoX codigo
juan -> No pertenece al lenguaje
JOse -> No pertenece al lenguaje
Luan -> No pertenece al lenguaje
565656aaa -> No pertenece al lenguaje
%_$__ -> No pertenece al lenguaje
Raa -> No pertenece al lenguaje
b -> Si pertenece
En línea

bdoX

Desconectado Desconectado

Mensajes: 31



Ver Perfil
Re: Expresion regular en Perl
« Respuesta #10 en: 11 Enero 2012, 03:23 »

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!!
En línea

D4RIO


Desconectado Desconectado

Mensajes: 996


STOP CENSORSHIP


Ver Perfil WWW
Re: Expresion regular en Perl
« Respuesta #11 en: 11 Enero 2012, 14:58 »

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
#!/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
En línea

RSA/RSA 4096 confiable x-hkp://keys.keysigning.org 789D025D<<back|track>> user
~ Yoya ~
Wiki

Desconectado Desconectado

Mensajes: 954



Ver Perfil
Re: Expresion regular en Perl
« Respuesta #12 en: 11 Enero 2012, 15:35 »

Si ps, yo tampoco entiendo tanto complicación, supongo porque no ha explicado bien que es lo que quieres hacer.
En línea

D4RIO


Desconectado Desconectado

Mensajes: 996


STOP CENSORSHIP


Ver Perfil WWW
Re: Expresion regular en Perl
« Respuesta #13 en: 11 Enero 2012, 17:41 »

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
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
En línea

RSA/RSA 4096 confiable x-hkp://keys.keysigning.org 789D025D<<back|track>> user
bdoX

Desconectado Desconectado

Mensajes: 31



Ver Perfil
Re: Expresion regular en Perl
« Respuesta #14 en: 11 Enero 2012, 19:49 »


La otra expresión:
Código
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ódigo:
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!
« Última modificación: 11 Enero 2012, 20:22 por bdoX » En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Una expresion regular en PERL....¡¡No la entiendo
Scripting
jcjuank 2 1,522 Último mensaje 21 Julio 2005, 15:22
por jcjuank
Expresión regular « 1 2 »
PHP
IWKY 29 6,938 Último mensaje 25 Enero 2010, 23:57
por ~ Yoya ~
Ayuda con Expresión Regular
Desarrollo Web
Shell Root 4 1,270 Último mensaje 10 Abril 2011, 22:26
por Shell Root
Expresión regular email
PHP
Littl3 1 1,072 Último mensaje 20 Septiembre 2011, 23:06
por ~ Yoya ~
ayuda con una expresion regular :(
Programación General
Elemental Code 6 150 Último mensaje 23 Mayo 2012, 04:10
por Elemental Code
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines