Foro de elhacker.net

Programación => Programación General => Mensaje iniciado por: criskapunk en 23 Agosto 2011, 22:57 pm



Título: [RETOS] Expresiones Regulares
Publicado por: criskapunk en 23 Agosto 2011, 22:57 pm
Buenas chicos, después de la aprobación de Nov, les traigo este post :P

(http://img64.imageshack.us/img64/2492/logoext.png)

Reglas: (Más que nada algunas recomendaciones para poder mantener el orden en el hilo).

  • Los retos se dividirán en tres niveles (Fácil - Medio - Difícil).
  • Podrá haber simultáneamente un máximo de UN reto de cada dificultad.
  • Cada reto tendrá una duración máxima de 12 horas. Pasado ese tiempo, si no se resuelve, se podrá publicar uno nuevo.
  • Una vez que el autor del reto de por válida una respuesta, deberá publicar la propia solución al desafío.
  • Se podrán publicar soluciones alternativas a retos antiguos, no hay problema con eso, la idea es practicar.

Acá les dejo el primero, si quieren pueden usar una plantilla similar a la siguiente:

Dificultad: 2 - Medio.
Reto: Realizar una expresión regular que valide nombres. Los mismos podrán ser simples o compuestos (Una o dos palabras). Unicamente podrán contener letras y las letras mayúsculas podrán aparecer sólo al principio de las palabras.

Cuando llego a casa publico la respuesta, que ya terminó mi horario laboral xD.

Un saludo y espero que les guste! :D


Título: Re: [RETOS] Expresiones Regulares
Publicado por: Darkgold9 en 23 Agosto 2011, 23:39 pm
Código:

([A-Z]?[a-záéíóú]*) | ([A-Z]?[a-záéíóú]*\S [A-Z]?[a-záéíóú]*)


Aqui sta mi propuesta.

Saludos


Título: Re: [RETOS] Expresiones Regulares
Publicado por: criskapunk en 24 Agosto 2011, 02:20 am
Yo la había pensado así:

Código:
^[a-zA-Z]?[a-z]+(\s[a-zA-Z]?[a-z]+)?

Pero por ejemplo, la mía no valida tildes y acepta como valido palabras de una sola letra. Voy a tener que ser más específico para la próxima :xD

@Darkgold9
Tu expresión (Según esta (http://gskinner.com/RegExr/) página) valida una única palabra solo si al final de la misma agregás un espacio. Además, no valida más de una palabra y toma como correcto escribir únicamente un espacio.

Un saludo y gracias por participar.



Título: Re: [RETOS] Expresiones Regulares
Publicado por: Shell Root en 24 Agosto 2011, 02:38 am
Código
  1. $sExpReg = '/^([a-záéíóúA-ZÁÉÍÓÚ]|(\s))*$/';

@R0LFback, para qué el operador ? en tu expresión?


Título: Re: [RETOS] Expresiones Regulares
Publicado por: criskapunk en 24 Agosto 2011, 02:58 am
@Shell Root:
Porque la segunda palabra puede o no estar. Te referís a ese o al ? del comienzo?

Tu expresión supera el límite de dos palabras :P Además acepta como válido solo espacios en blanco.

Un saludo.


Título: Re: [RETOS] Expresiones Regulares
Publicado por: Shell Root en 24 Agosto 2011, 03:04 am
Hay nombres con espacios vacíos, -es mentiras, ajajjaja este no es mi fuerte-


La primera, se supone qué al usar [a-zA-Z] se puede ingresar una mayúscula o minúscula.


Título: Re: [RETOS] Expresiones Regulares
Publicado por: criskapunk en 24 Agosto 2011, 03:28 am
Jaja! Un nombre escrito en Whitespace (http://es.wikipedia.org/wiki/Whitespace)

Lo del ? es por esto que puse en el primer post:

Citar
las letras mayúsculas podrán aparecer sólo al principio de las palabras

Pueden aparecer o no.

Un saludo.


Título: Re: [RETOS] Expresiones Regulares
Publicado por: Shell Root en 24 Agosto 2011, 03:36 am
Al parecer no entiendes lo que te quiero decir, intetad ejecutar lo siguiente,

Código
  1. ^[a-zA-Z]+(\s[a-zA-Z]?[a-z]+)?


Título: Re: [RETOS] Expresiones Regulares
Publicado por: Valkyr en 24 Agosto 2011, 04:10 am
Yo propondría esta:

Código:
[A-Z]?[a-z]+( [A-Z]?[a-z]+)?

Reconoce nombres que empiecen por mayúsculas y pueden tener uno o dos nombres, y además los que empiecen por minúsculas.

Saludos.


Título: Re: [RETOS] Expresiones Regulares
Publicado por: Shell Root en 24 Agosto 2011, 04:36 am
@Valkyr, faltan las tildes, para nombres como Héctor.

Código
  1. ^[A-ÁÉÍÓÚa-záéíóúA]+( [A-ZÁÉÍÓÚa-záéíóúA]+)$


Título: Re: [RETOS] Expresiones Regulares
Publicado por: criskapunk en 24 Agosto 2011, 04:41 am
@Shell Root:
Esa expresión permite en la primer palabra que todas las letras sean mayúsculas. Solo pueden ir al principio de cada una.

@Valkyr:
Funciona perfecto :D Cumple con los requisitos que puse en el primer post. Te toca postear reto.

Un saludo.



Título: Re: [RETOS] Expresiones Regulares
Publicado por: Valkyr en 24 Agosto 2011, 15:48 pm
Shell Root, no puse tildes porque en el primer post no especificaba que los nombres pudiesen llevar tildes, sí quisiesemos que la expresión regular reconociese muchos más nombres habría que hacer exactamente lo que dices.

De acuerdo, pues yo propongo este:

Expresión regular para buscar cadenas que vayan entre comillas, sin  comillas dentro y que puedan ocupar varias líneas.

Tendría que reconocer las siguientes cadenas (las que están subrayadas):

Citar
" Hola señores" "Comillas comillas y comillas" " "

"Reto de expresiones

regulares
elhacker.net
"

Iré revisando las respuestas para ver qué proponeis. Yo ya tengo la mía hecha, cuando alguien proponga alguna que lo resuelva posteo la mia.

Saludos.


Título: Re: [RETOS] Expresiones Regulares
Publicado por: Darkgold9 en 24 Agosto 2011, 16:05 pm
Código:

(\"[^\"]*\")+


Aki va la mia

Saludos


Título: Re: [RETOS] Expresiones Regulares
Publicado por: criskapunk en 24 Agosto 2011, 16:10 pm
Código:
^"[\w?\s?(\r\n)?]*"$

Edit: Me compliqué demasiado parece :xD No sabía que había que escapar las comillas, por eso no me funcionaba la expresión.

Un saludo.


Título: Re: [RETOS] Expresiones Regulares
Publicado por: Valkyr en 24 Agosto 2011, 17:08 pm
Darkgold9 la tuya funciona perfectamente, lo único que puedo poner de pega es que la barra de escape no es necesaria, sería necesaria si por ejemplo estuviésemos programando y al crear una cadena de texto esa cadena contuviese comillas dentro, pero para las expresiones regulares como tal, no es necesario, aún así funciona correctamente. Te paso el testigo y te toca reto xD.

R0LFback la que propones no es correcta. Me parece que sobran las ?, además, al colocar el paréntesis lo toma como el carácter que es, no como un conjunto. Tampoco reconoce los que están en varías líneas.

Saludos a todos.


Título: Re: [RETOS] Expresiones Regulares
Publicado por: criskapunk en 24 Agosto 2011, 17:41 pm
Edito: Error mío, perdón.


Título: Re: [RETOS] Expresiones Regulares
Publicado por: Darkgold9 en 24 Agosto 2011, 18:07 pm
Citar
Darkgold9 la tuya funciona perfectamente, lo único que puedo poner de pega es que la barra de escape no es necesaria, sería necesaria si por ejemplo estuviésemos programando y al crear una cadena de texto esa cadena contuviese comillas dentro, pero para las expresiones regulares como tal, no es necesario, aún así funciona correctamente. Te paso el testigo y te toca reto xD.

Lo tendre en cuenta thx  :).

Pues aqui va mi reto:

Expresion regular que reconozca una cadena con formato horario, es decir,
 con el patrón HH:MM (H = hora, M= minuto) o bien con el patrón H:MM.
Tener en cuenta que las horas deben ser correctas. Por ejemplo: 29:80 no valdria.
Ejemplos:

01:00
00:00
23:50
2:38
...


Título: Re: [RETOS] Expresiones Regulares
Publicado por: Valkyr en 24 Agosto 2011, 22:35 pm
Propongo la siguiente expresión regular:

Código:
(([0-1]\d|2[0-3])|\d):[0-5]\d

Reconoce los ejemplos que has puesto xD.

Saludos.


Título: Re: [RETOS] Expresiones Regulares
Publicado por: Darkgold9 en 24 Agosto 2011, 23:34 pm
Citar
Propongo la siguiente expresión regular:

Código:
Código:
(([0-1]\d|2[0-3])|\d):[0-5]\d

Reconoce los ejemplos que has puesto xD.

Saludos.

Exacto, es exactamente la misma que habia hecho yo  :xD.

A ver si alguien mas se anima, te paso el poder >:D :laugh:



Título: Re: [RETOS] Expresiones Regulares
Publicado por: criskapunk en 25 Agosto 2011, 15:07 pm
Buenas chicos,

Esa expresión no valida bien. Devuelve lo siguiente:

Código:
0:00	Formato valido
00:00 Formato valido
23:59 Formato valido
24:00 Formato valido
100:00 Formato valido
12:000 Formato valido
8:10    Formato valido
08:10 Formato valido
001:05 Formato valido
99:00 Formato valido

Mi expresión es así (Hay que agregarle únicamente el ^ y $ :xD).

Código:
^([0-1]\d|2[0-3]|(\d)):([0-5]\d)$

Código:
0:00	Formato valido
00:00 Formato valido
23:59 Formato valido
24:00 Formato invalido
100:00 Formato invalido
12:000 Formato invalido
8:10 Formato valido
08:10 Formato valido
001:05 Formato invalido
99:00 Formato invalido

Les dejo el script que utilicé.

Código
  1. <?php
  2.  
  3. $cadenas = array (
  4. 0=>"0:00",
  5. 1=>"00:00",
  6. 2=>"23:59",
  7. 3=>"24:00",
  8. 4=>"100:00",
  9. 5=>"12:000",
  10. 6=>"8:10",
  11. 7=>"08:10",
  12. 8=>"001:05",
  13. 9=>"99:00",
  14. );
  15.  
  16. $patron = "/^([0-1]\d|2[0-3]|(\d)):([0-5]\d)$/";
  17.  
  18. for($i = 0; $i < count($cadenas); $i++)
  19. {
  20. if (preg_match($patron, $cadenas[$i]))
  21. {
  22. print $cadenas[$i];
  23. print " Formato valido<br>";
  24. } else
  25. {
  26. print $cadenas[$i];
  27. print " Formato invalido<br>";
  28. }
  29. }
  30.  
  31. ?>

Un saludo.


Título: Re: [RETOS] Expresiones Regulares
Publicado por: criskapunk en 26 Agosto 2011, 14:34 pm
Como no publicaron nada todavía, para que no muera el hilo les dejo otro reto.


Validar fechas con el siguiente formato: dd/mm/aaaa.

(La cadena 1/2/2000 no sería válida. Tendría que ser 01/02/2000, por ejemplo).
- Comprobar si la cantidad de días es correcta para el mes en cuestión. Por ejemplo, no sería correcta 30/02/2000. Para Febrero tomamos como valor de 28 días, sin considerar años bisiestos (No se si esto se podrá hacer con RegExp xD).
- El intervalo de años debe estar entre 1900 y 2050.

Edito:
Ya la terminé. Es ILEGIBLE :P

Un saludo.


Título: Re: [RETOS] Expresiones Regulares
Publicado por: raul338 en 27 Agosto 2011, 01:47 am
Código:
^(?>3[01]|0[1-9]|[12]\d)/(?>(?<=(?>0[1-9]|[12]\d)/)(?>0[1-9]|1[012])|(?<=31/)(?>0[13578]|1[02])|(?<=30/)(?>0[13-9]|1[012]))/(?>19\d\d|20[0-4]\d|2050)$

Pruebenlo :P me costo un poco

PD: No se sabe si el año es bisiesto o no :xD y creo que eso no se puede saber


Título: Re: [RETOS] Expresiones Regulares
Publicado por: Shell Root en 27 Agosto 2011, 01:57 am
No se porque no funciona con 30/12/2011, esta correcta la fecha no?, y falta validar 00/12/2011, 00/00/2011, 01/13/2011


Título: Re: [RETOS] Expresiones Regulares
Publicado por: criskapunk en 27 Agosto 2011, 02:09 am
Raul, tu expresión toma como válidos los años del 2051 al 2059. Era hasta el 2050 inclusive.

Edito:
@Shell Root: Las fechas 00/12/2011 y 00/00/2011 no se tienen que validar, no existen los días o meses cero.

Un saludo y gracias por participar :P


Título: Re: [RETOS] Expresiones Regulares
Publicado por: Shell Root en 27 Agosto 2011, 02:13 am
¬¬ Crees que soy estupido o que? Obviamente no, pero la ExpReg la filtra como si fuera una fecha correcta.


Título: Re: [RETOS] Expresiones Regulares
Publicado por: criskapunk en 27 Agosto 2011, 02:15 am
No era para que te lo tomes a mal. Entendí mal tu mensaje. Disculpas.

Un saludo.


Título: Re: [RETOS] Expresiones Regulares
Publicado por: Valkyr en 27 Agosto 2011, 03:00 am
Perdón por no haber posteado ningún reto pero me ha sido imposible conectarme apenas más de cinco minutos.

Yo he sacado esta expresión, es un poco engorrosa pero creo que puede valer:

Código:
^((0[1-9]|[12]\d)/(0[13-9]|1[0-2])|28/02|3(0/(04|06|09|11)|1/(01|03|05|07|08|10|12)))/(19\d\d|20([0-4]\d|50))$

Supongo que quizás podría simplificarse pero no es cuestión de matarme mirando la expresión a estas horas.

Saludos.


Título: Re: [RETOS] Expresiones Regulares
Publicado por: raul338 en 27 Agosto 2011, 03:09 am
Ya arregle la mía  ;D

@Valkyr link: Tu Expresion regular no me toma como valida estas fechas

Código:
30/07/2000
01/02/2000

Edit, estas fechas deberian ser validas

Código:
31/07/2000
30/07/2000
01/02/2000
25/05/2002
15/07/2000
28/02/2001
31/05/2001
30/12/2011
29/02/2001

y estas no
Código:
01/00/2011
31/04/2001
00/12/2011
00/00/2011
01/13/2011
30/02/2001
25/05/2051


Título: Re: [RETOS] Expresiones Regulares
Publicado por: Shell Root en 27 Agosto 2011, 06:24 am
Emmm no @raul338,

Intentad con 01/00/2011


Título: Re: [RETOS] Expresiones Regulares
Publicado por: raul338 en 27 Agosto 2011, 14:48 pm
Emmm no @raul338,

Intentad con 01/00/2011

Editado :D


Título: Re: [RETOS] Expresiones Regulares
Publicado por: raul338 en 28 Agosto 2011, 09:30 am
Bueno pues... ya que no hubo actividad... propongo el reto :3

el reto es validar una URI en todas sus formas :3 desde http://hola/ hasta http:8080//en.misitio.gov.ar/carpeta/archivo/1.html?aaa=eee&iii=ooo#una

:P