Thread View: es.comp.os.linux.programacion
12 messages
12 total messages
Started by F
Thu, 05 Apr 2007 14:19
Ayuda con expresiones regulares
Author: F
Date: Thu, 05 Apr 2007 14:19
Date: Thu, 05 Apr 2007 14:19
25 lines
1614 bytes
1614 bytes
Hola, Tengo una cadena con las siguientes caracteristicas -El numero de caracteres siempre tiene que ser 7 -puede tener alfanumericos y espacios, pero todos los alfanumericos que tengan tienen que estar al principio y todos lo espacios al final ( es decir no se pueden intercarlar). Puede resolver estas dos condiciones por separado, pero no he conseguido resolverlo juntas �alguien me puede echar una mano? cadenas validos serian "a " "asd " " " "xxxxxxx" he invalidas "a s " " " "asas"
Re: Ayuda con expresiones regulares
Author: Gonzalo Pérez de Olaguer Córdoba
Date: Thu, 05 Apr 2007 17:57
Date: Thu, 05 Apr 2007 17:57
31 lines
2116 bytes
2116 bytes
Hola "F" <esnewsfQuItAeStO@EsToCaMbIeNyahoo.es> el Thu, 05 Apr 2007 14:19:55 GMT escribiste: > Hola, > > Tengo una cadena con las siguientes caracteristicas > > -El numero de caracteres siempre tiene que ser 7 > -puede tener alfanumericos y espacios, pero todos los alfanumericos que > tengan tienen que estar al principio y todos lo espacios al final ( es decir > no se pueden intercarlar). > > Puede resolver estas dos condiciones por separado, pero no he conseguido > resolverlo juntas > > ¿alguien me puede echar una mano? No dices en qué lenguaje quieres hacer eso. En una sóla expresión regular es posible hacer algo así: (7 alnum) o (6 alnum y 1 espacio) o (5 alnum y 2 espacios) o ... En dos fases puedes verificar primero que la cadena tenga siete caracteres y luego ver que coincida con [[:alnum:]]*[[:space:]]* -- Gonzalo Pérez de Olaguer Córdoba <gpoc@iies.es> PGP key 2861C704 --- F206 5671 6789 425D 111C 1302 214F 1934 2861 C704
Re: Ayuda con expresiones regulares
Author: Oscar Garcia
Date: Thu, 05 Apr 2007 22:28
Date: Thu, 05 Apr 2007 22:28
37 lines
2152 bytes
2152 bytes
F escribi�:
> Tengo una cadena con las siguientes caracteristicas
> -El numero de caracteres siempre tiene que ser 7
> -puede tener alfanumericos y espacios, pero todos los alfanumericos que
> tengan tienen que estar al principio y todos lo espacios al final ( es decir
> no se pueden intercarlar).
> Puede resolver estas dos condiciones por separado, pero no he conseguido
> resolverlo juntas
> �alguien me puede echar una mano?
La cadena resultante ser�a demasiado larga... si quieres te puedo hacer
un ejemplo con 3 caracteres y t� lo haces para m�s.
^([[:space:]{3}]|[[:alnum:]][[:space:]{2}]|[[:alnum:]]{2}[[:space:]]|[[:alnum:]]{3})$
Es decir:
3 espacios
� 1 car�cter alfanum�rico y 2 espacios
� 2 caracteres alfanum�ricos y 1 espacio
� 3 caracteres alfanum�ricos
> cadenas validos serian
> "a "
> "asd "
> " "
> "xxxxxxx"
La segunda no la veo yo muy clara, �no?
Saludos.
--
�scar Javier Garc�a Baudet
Remember: Un*x _IS_ user friendly...
It's just selective about who it's friends are
http://redstar.linaresdigital.com/
Re: Ayuda con expresiones regulares
Author: Pascal Bourguignon
Date: Fri, 06 Apr 2007 12:07
Date: Fri, 06 Apr 2007 12:07
75 lines
3483 bytes
3483 bytes
"F" <esnewsfQuItAeStO@EsToCaMbIeNyahoo.es> writes:
> Hola,
>
> Tengo una cadena con las siguientes caracteristicas
>
> -El numero de caracteres siempre tiene que ser 7
> -puede tener alfanumericos y espacios, pero todos los alfanumericos que
> tengan tienen que estar al principio y todos lo espacios al final ( es decir
> no se pueden intercarlar).
>
> Puede resolver estas dos condiciones por separado, pero no he conseguido
> resolverlo juntas
>
> �alguien me puede echar una mano?
Muy a menudo, se puede hacer mas facilmente una expresion regular
inversa, or usar varias expresiones regulares.
Por ejemplo, el lenguaje que quieres reconocer es la intersecsion de
/^.......$/ y /^[A-Za-z0-9]* *$/
Lo mas simple, en un programa, seria de comprobar las dos expresiones.
(if (and (= 7 (length string)) (regexp-match "^[A-Za-z0-9]* *$" string))
(got-it)
(not-a-word))
Si quieres construir una expresion regular sola, es posible, pero a
menudo eso da expresiones muy largas, porque el lenguaje de las
expresiones regulares es muy rudimentario.
;; adaptar estas re- funciones de acuerdo con la syntax de regexp usada...
(defun re-sequence (&rest args)
(apply (function concatenate) 'string args))
(defun re-repeat (re times)
(case times
((0) "")
((1) re)
(otherwise (format nil "\\(~A\\){~D}" re times))))
(defun re-alternate (&rest alternatives)
(format nil "\\(~{~A~^\\|~}" alternatives))
(defun build-my-re (n)
(re-sequence
"^\\("
(apply (function re-alternate)
(loop for i from 0 to n
collect (re-sequence (re-repeat "[A-Za-z0-9]" i)
(re-repeat " " (- n i)))))
"\\)$"))
(build-my-re 7)
--> "^\\(\\(\\( \\){7}\\|[A-Za-z0-9]\\( \\){6}\\|\\([A-Za-z0-9]\\){2}\\( \\){5}\\|\\([A-Za-z0-9]\\){3}\\( \\){4}\\|\\([A-Za-z0-9]\\){4}\\( \\){3}\\|\\([A-Za-z0-9]\\){5}\\( \\){2}\\|\\([A-Za-z0-9]\\){6} \\|\\([A-Za-z0-9]\\){7}\\)$"
> cadenas validos serian
>
> "a "
> "asd "
> " "
> "xxxxxxx"
>
> he invalidas
> "a s "
> " "
> "asas"
--
__Pascal Bourguignon__
http://www.informatimago.com
http://pjb.ogamita.org
Re: Ayuda con expresiones regulares
Author: gamo
Date: Sat, 07 Apr 2007 10:01
Date: Sat, 07 Apr 2007 10:01
66 lines
2738 bytes
2738 bytes
This message is in MIME format. The first part should be readable text,
while the remaining parts are likely unreadable without MIME-aware tools.
--8323328-1014992884-1175940064=:16935
Content-Type: TEXT/PLAIN; charset=ISO-8859-1
Content-Transfer-Encoding: QUOTED-PRINTABLE
On Thu, 5 Apr 2007, F wrote:
> Hola,
>=20
> Tengo una cadena con las siguientes caracteristicas
>=20
> -El numero de caracteres siempre tiene que ser 7
> -puede tener alfanumericos y espacios, pero todos los alfanumericos que=
=20
> tengan tienen que estar al principio y todos lo espacios al final ( es de=
cir=20
> no se pueden intercarlar).
>=20
> Puede resolver estas dos condiciones por separado, pero no he conseguido=
=20
> resolverlo juntas
>=20
> =BFalguien me puede echar una mano?
>=20
> cadenas validos serian
>=20
> "a "
> "asd "
> " "
> "xxxxxxx"
>=20
> he invalidas
> "a s "
> " "
> "asas"
>=20
>=20
Si por "resolver" entiendes validar o no, puedes examinar car=E1cter
a car=E1cter y escapar en cuanto se produzca la violaci=F3n. No veo la
necesidad de utilizar expresiones regulares.
En cuanto a la violaci=F3n, entiendo que s=F3lo se produce al pasar de
espacio a no espacio, por lo que es f=E1cil de chequear.=20
sub validar {
=09my $string =3D $_[1];
=09return -1 if length($string)!=3D7;
=09my @s =3D split "", $string;
=09my $iant=3D"";
=09for my $i (@s){
=09=09if ($iant eq " " && $i ne " ") { return -1; }
=09=09$iant=3D$i;
=09}=09
=09return 1;
}
# untested=20
Saludos cordiales
--=20
http://www.telecable.es/personales/gamo/
perl -e 'print 111_111_111**2,"\n";'
--8323328-1014992884-1175940064=:16935--
Re: Ayuda con expresiones regulares
Author: gamo
Date: Sat, 07 Apr 2007 10:29
Date: Sat, 07 Apr 2007 10:29
21 lines
1601 bytes
1601 bytes
This message is in MIME format. The first part should be readable text,
while the remaining parts are likely unreadable without MIME-aware tools.
--8323328-1705782823-1175941766=:16976
Content-Type: TEXT/PLAIN; charset=ISO-8859-1
Content-Transfer-Encoding: QUOTED-PRINTABLE
On Sat, 7 Apr 2007, gamo wrote:
Otra opci=F3n corregida y m=E1s corta:
> sub validar {
> =09my $string =3D $_[0];
> =09return -1 if length($string)!=3D7;
>=09return -1 if ($string =3D~ /\s\S/); =09
> =09return 1;
> }
> # untested=20
>=20
> Saludos cordiales
--8323328-1705782823-1175941766=:16976--
Re: Ayuda con expresiones regulares
Author: Jos� Luis P�rez Diez
Date: Wed, 11 Apr 2007 15:52
Date: Wed, 11 Apr 2007 15:52
40 lines
2376 bytes
2376 bytes
In article <Pine.LNX.4.64.0704071129260.16935@jvz.es>, Gamo wrote:
> sub validar {
#Bien vamos a comentar perl
#> my $string = $_[1];
my $string = shift; #Best practice
#> return -1 if length($string)!=7;
#> my @s = split "", $string;
#> my $iant="";
#> for my $i (@s){
#> if ($iant eq " " && $i ne " ") { return -1; }
#> $iant=$i;
#> }
#> return 1;
if (length($string) = 7) {
$string ~= /(\S*)(\s*)/;#todo en blanco ok
#$string ~= /(\S+)(\s*)/;#almenos un no blanco
return length($1.$2) = 7;
}else return undef;
> }
Hay muchismas formas de hacerlo y no creo que una regex sea la mejor
para mi la mejor es algo parecdo a lo que Gamo escribio despues en hilo
sub validar {
my $string = shift;
return (length($string) =7) - ($string =~ /\s\S/);
}
Las dos estan sin comprobar y escritas de memoria
--
Los programadores esta ocupados intendtado mejorar los programas a
prueba de idiotas. Mientras tanto el universo intenta mejorar los
idiotas. El universo va ganando
Re: Ayuda con expresiones regulares
Author: Gonzalo Pérez de Olaguer Córdoba
Date: Thu, 12 Apr 2007 22:48
Date: Thu, 12 Apr 2007 22:48
49 lines
2646 bytes
2646 bytes
Hola José Luis Pérez Diez <jluis@agujero-negro.escomposlinux.org>
el Wed, 11 Apr 2007 17:52:23 +0200 escribiste:
> In article <Pine.LNX.4.64.0704071129260.16935@jvz.es>, Gamo wrote:
> > sub validar {
>
> #Bien vamos a comentar perl
>
> #> my $string = $_[1];
> my $string = shift; #Best practice
>
> #> return -1 if length($string)!=7;
> #> my @s = split "", $string;
> #> my $iant="";
> #> for my $i (@s){
> #> if ($iant eq " " && $i ne " ") { return -1; }
> #> $iant=$i;
> #> }
> #> return 1;
> if (length($string) = 7) {
> $string ~= /(\S*)(\s*)/;#todo en blanco ok
> #$string ~= /(\S+)(\s*)/;#almenos un no blanco
mejor /^(\S*)(\s*)$/
> return length($1.$2) = 7;
> }else return undef;
>
>
> > }
>
>
> Hay muchismas formas de hacerlo y no creo que una regex sea la mejor
> para mi la mejor es algo parecdo a lo que Gamo escribio despues en hilo
>
> sub validar {
> my $string = shift;
> return (length($string) =7) - ($string =~ /\s\S/);
yo haría: length($string) == 7 and $string =~ m/^\S*\s*$/;
> }
>
> Las dos estan sin comprobar y escritas de memoria
--
Gonzalo Pérez de Olaguer Córdoba <gpoc@iies.es>
PGP key 2861C704 --- F206 5671 6789 425D 111C 1302 214F 1934 2861 C704
Re: Ayuda con expresiones regulares
Author: gamo
Date: Fri, 13 Apr 2007 14:18
Date: Fri, 13 Apr 2007 14:18
24 lines
1849 bytes
1849 bytes
This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. --8323328-1059311625-1176473880=:20123 Content-Type: TEXT/PLAIN; charset=ISO-8859-1 Content-Transfer-Encoding: QUOTED-PRINTABLE On Fri, 13 Apr 2007, Gonzalo P=E9rez de Olaguer C=F3rdoba wrote: Hola=20 Tanto esto: > > $string ~=3D /(\S*)(\s*)/;#todo en blanco ok como esto: >=20 > mejor /^(\S*)(\s*)$/ >=20 se cumple siempre, para cualquier cadena. Adem=E1s de ser glotones, los * inducen a muchos errores. Saludos cordiales --8323328-1059311625-1176473880=:20123--
Re: Ayuda con expresiones regulares
Author: Gonzalo Pérez de Olaguer Córdoba
Date: Fri, 13 Apr 2007 20:03
Date: Fri, 13 Apr 2007 20:03
30 lines
2133 bytes
2133 bytes
Hola gamo <gamo@telecable.es> el Fri, 13 Apr 2007 16:18:00 +0200 escribiste: > On Fri, 13 Apr 2007, Gonzalo Pérez de Olaguer Córdoba wrote: > > Hola > > Tanto esto: > > > > $string ~= /(\S*)(\s*)/;#todo en blanco ok > > como esto: > > > > mejor /^(\S*)(\s*)$/ > > > > se cumple siempre, para cualquier cadena. ten en cuenta que estamos hablando de una cadena para la que se ha verificado que tiene 7 caracteres. No se cumple, por ejemplo, para "1 3 5 7". Sí para "1234 ". > Además de ser glotones, los * inducen a muchos errores. > Saludos cordiales -- Gonzalo Pérez de Olaguer Córdoba <gpoc@iies.es> PGP key 2861C704 --- F206 5671 6789 425D 111C 1302 214F 1934 2861 C704
Re: Ayuda con expresiones regulares
Author: gamo
Date: Sat, 14 Apr 2007 09:41
Date: Sat, 14 Apr 2007 09:41
50 lines
2917 bytes
2917 bytes
This message is in MIME format. The first part should be readable text,
while the remaining parts are likely unreadable without MIME-aware tools.
--8323328-1125794192-1176543676=:20579
Content-Type: TEXT/PLAIN; charset=ISO-8859-1
Content-Transfer-Encoding: QUOTED-PRINTABLE
On Fri, 13 Apr 2007, Gonzalo P=E9rez de Olaguer C=F3rdoba wrote:
> > se cumple siempre, para cualquier cadena.
>=20
> ten en cuenta que estamos hablando de una cadena para la que
> se ha verificado que tiene 7 caracteres. No se cumple, por
> ejemplo, para "1 3 5 7". S=ED para "1234 ".
Efectivamente. Luego queda el segundo inconveniente.
>=20
> > Adem=E1s de ser glotones, los * inducen a muchos errores.
> > Saludos cordiales
>=20
>=20
He hecho 3 pruebas: sin regex, con mi regex del segundo post y=20
algo similar a lo que proponeis vosotros con el *
Los resultados son estos:=20
Rate * A PELO REGEX
* 568030/s -- -5% -5%
A PELO 598943/s 5% -- -0%
REGEX 599907/s 6% 0% --
y conste que me sorprendi=F3 que no ganase A PELO, ya que en comparaciones
2 a 2 antes s=ED que ganaba con un 3% (depende mucho de las cadenas de=20
prueba que le metas). Si el lenguaje no es Perl, dudo mucho que=20
merezca la pena usar regex.=20
=20
Saludos cordiales=20
>=20
> --=20
> Gonzalo P=E9rez de Olaguer C=F3rdoba <gpoc@iies.es>
> PGP key 2861C704 --- F206 5671 6789 425D 111C 1302 214F 1934 2861 C704
>=20
--=20
http://www.telecable.es/personales/gamo/
perl -e 'print 111_111_111**2,"\n";'
--8323328-1125794192-1176543676=:20579--
Re: Ayuda con expresiones regulares
Author: Jos� Luis P�rez Diez
Date: Mon, 16 Apr 2007 09:30
Date: Mon, 16 Apr 2007 09:30
42 lines
2779 bytes
2779 bytes
In article <Pine.LNX.4.64.0704141131590.20579@jvz.es>, Gamo wrote: > He hecho 3 pruebas: sin regex, con mi regex del segundo post y > algo similar a lo que proponeis vosotros con el * > > Los resultados son estos: > > Rate * A PELO REGEX > * 568030/s -- -5% -5% > A PELO 598943/s 5% -- -0% > REGEX 599907/s 6% 0% -- > > y conste que me sorprendi� que no ganase A PELO, ya que en comparaciones > 2 a 2 antes s� que ganaba con un 3% (depende mucho de las cadenas de > prueba que le metas). Si el lenguaje no es Perl, dudo mucho que > merezca la pena usar regex. > > Saludos cordiales > A mi lo que mas me estra�a es la peticion de 7 caracteres, esto solo tiene sentido si es introducida por un operador. Si nos fijamos en la peticion la secuencia solo es invalida si tras un espacio hay algo que no sea un espacio lo que nos dejaria si tiene la clave. En perl todas las expresiones regulares son glotonas a no ser que indiques lo contrario. Yo personamente usaria trim, (trim($clave) !~ /\s/), para comprobar la validez. -- Los programadores esta ocupados intendtado mejorar los programas a prueba de idiotas. Mientras tanto el universo intenta mejorar los idiotas. El universo va ganando
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads