Avatar billede snappi-v Nybegynder
09. januar 2008 - 10:39 Der er 10 kommentarer

Reg Exp. genkend både dato som 01/01 og 1/12

Hej,

jeg genkender datoer via denne
(0[1-9]|[12]\d|3[012])-(0[1-9]|1[012])-(19|20)\d{2}
den virker fint hvis input f.eks. er "01-01-2004"

jeg vil også meget gerne have den til at virke hvis dato formatettet ser sådan her ud
"1-7-2008"
eller
"01-4-2001"

kan i følge mig?
Avatar billede erikjacobsen Ekspert
09. januar 2008 - 11:13 #1
(0?[1-9]|[12]\d|3[012])-(0?[1-9]|1[012])-(19|20)\d{2}
Avatar billede nielle Nybegynder
09. januar 2008 - 17:51 #2
Pssst! Jeg har opdateret artiklen. :^)
Avatar billede nielle Nybegynder
09. januar 2008 - 23:17 #3
Opdagede lge en fejl. Den skal være:

(0?[1-9]|[12]\d|3[01])-(0?[1-9]|1[012])-(19|20)\d{2}

Der er jo ikke nogen måneder med 32 dage. *rødme*
Avatar billede erikjacobsen Ekspert
09. januar 2008 - 23:19 #4
Nogle måneder *føles* så lange, mens man venter på lønningsdagen.

Men derudover skal man jo alligevel efterfølgende kontrollere om der er tastet den 29. februar i de år, hvor den dato li'som ikke findes.
Avatar billede erikjacobsen Ekspert
09. januar 2008 - 23:20 #5
Og 31. april ... osv.
Avatar billede snappi-v Nybegynder
10. januar 2008 - 12:12 #6
Blot til information. :-) Så, ja vil det jo være en bulletproof løsning hvis den også kunne dedektere d.29feb når den ikke findes osv, men i praksis, og med de kroner der er sat af til projektet, er overstående løsning perfekt.

Tak for svarene.
Avatar billede erikjacobsen Ekspert
10. januar 2008 - 13:38 #7
Man kan bruge min tommelfinger-regel, der siger:

  1) Brug kun det regulære udtryk til at kontrollere den faste syntaks
  2) Brug det bagvedliggende programmeringssprog til at kontrollere andre afhængigheder.

Vedr. 1 kunne man diskutere om man ikke bare ku' bruge \d?\d-\d?\d-\d\d\d\d  fordi man alligevel er nødt til i punkt 2 at checke datoer mod 29 og 31 i forhold til deres måned. osv.
Avatar billede erikjacobsen Ekspert
10. januar 2008 - 13:41 #8
Nå, ja, og

  3) Vælg en løsning, der giver de ønskede fejlrapporteringsmuligheder.

Hvis du kun bruger den fra spørgsmålet, har du kun mulighed for at sige "forkert dato", mens man ved passende programmering i punkt 2 kan sige fx. "Altså, tag dig nu sammen, der er ikke en måned med nummer 13"
Avatar billede snappi-v Nybegynder
10. januar 2008 - 18:09 #9
ericjacobsen, vi er helt enige om at den smukkeste - og mest tidskrævende - løsning, er den sidste. Men forretningsmæssigt, skal man jo også veje det op i mod hvor det er passende at lægge energien og tiden i projektet.

Forstå mig ret, det er ikke fordi jeg vil kode et skod produkt - men det er en balance gang, på hvor meget man skal gøre ud af diverse ting, kontra hvad det giver i den sidste ende :-).

I dette tilfælde er det besluttet at systemet, sagtens kan fungere optimalt ved at nøjes med at fortælle brugeren, at han har tastet en forkert dato, i stedet for at en dato f.eks ikke indholder tegnet "@" (eksempel).
Avatar billede erikjacobsen Ekspert
10. januar 2008 - 19:24 #10
Helt enig - cost/benefit. Men det her er jo noget man enten tager op af skuffen fra et tidligere projekt, eller laver, fordi man vil også vil lægge det i skuffen af standardløsninger. Det er også noget, der kan komme på senere. Men prøv hvad der sker ved "31-04-2008", bare for sjov.

Og så samler jeg slet ikke på point, tak.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester