🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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
#583
Author: F
Date: Thu, 05 Apr 2007 14:19
25 lines
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
#584
Author: Gonzalo Pérez de Olaguer Córdoba
Date: Thu, 05 Apr 2007 17:57
31 lines
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
#585
Author: Oscar Garcia
Date: Thu, 05 Apr 2007 22:28
37 lines
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
#586
Author: Pascal Bourguignon
Date: Fri, 06 Apr 2007 12:07
75 lines
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
#587
Author: gamo
Date: Sat, 07 Apr 2007 10:01
66 lines
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
#512
Author: gamo
Date: Sat, 07 Apr 2007 10:29
21 lines
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
#513
Author: Jos� Luis P�rez Diez
Date: Wed, 11 Apr 2007 15:52
40 lines
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
#514
Author: Gonzalo Pérez de Olaguer Córdoba
Date: Thu, 12 Apr 2007 22:48
49 lines
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
#515
Author: gamo
Date: Fri, 13 Apr 2007 14:18
24 lines
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
#516
Author: Gonzalo Pérez de Olaguer Córdoba
Date: Fri, 13 Apr 2007 20:03
30 lines
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
#517
Author: gamo
Date: Sat, 14 Apr 2007 09:41
50 lines
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
#518
Author: Jos� Luis P�rez Diez
Date: Mon, 16 Apr 2007 09:30
42 lines
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