Avatar billede badal Nybegynder
14. december 2011 - 15:46 Der er 11 kommentarer og
1 løsning

Disse datoer må ikke vælges

jeg skal lave en regex til .NET, som skal give en fejl hvis brugeren indtaster nogle bestemte datoer.

F.eks. må en bruger ikke indtaste 2011-12-24 og 2011-12-25.

Nogen der kan hjælpe?
14. december 2011 - 17:35 #1
Hvorfor er det lige regex, der skal bruges til at frasortere datoer?  Ligger det ikke mere for hånden at placere de ikke-valgbare datoer i en database tabel og så køre noget i retning af:

if(mysql_num_rows(mysql_query("SELECT * FROM non_datas WHERE dato = '$dato'")))
{
  [forbyd datoen]
}
else
{
  [kør videre]
}
 
Så ville det formentligt også være nemmere at tilføje nye forbudte datoer i fremtiden.
Avatar billede tjp Mester
14. december 2011 - 17:37 #2
Du kan melde fejl, hvis dato matcher denne regexp:
^2011\-12\-24|2011\-12\-25$

Eller omvendt melde fejl, hvis denne ikke matcher:
(?=^\d{4}\-\d{2}\-\d{2}$)(?!2011\-12\-24|2011\-12\-25)
21. december 2011 - 08:41 #3
basdal, hvad er din videre hensigt med dette spørgsmål?  Var indlæggene til hjælp?  I så fald bed om svar.  Hvis de var utilstrækkelige, så fortæl hvor de fejlede. Hvis spørgsmålet ikke længere er aktuelt, så opret selv et svar og accepter det for at få spørgsmålet lukket.  Under alle omstændigheder, lad os ikke blive hængende i et åbent spørgsmål.
Avatar billede badal Nybegynder
21. december 2011 - 10:04 #4
Jeg er stadig igang med denne, så den er ikke afsluttet endnu.

Det er regex "(?=^\d{4}\-\d{2}\-\d{2}$)(?!2011\-12\-24|2011\-12\-25)" som tjp har lavet som er det jeg eftersøger. Den virker ikke helt da den matcher på alle valide datoer.
jeg tester den her:
http://www.regular-expressions.info/javascriptexample.html

Her er min c# kode:
<asp:ValidationSummary ID="ValidationSummary1" EnableClientScript="true" runat="server" />
        <asp:RegularExpressionValidator ValidationExpression="(?=^\d{4}\-\d{2}\-\d{2}$)(?!2011\-12\-24|2011\-12\-25)"
            ControlToValidate="txtTo" ID="RegularExpressionValidator1" runat="server" Text="*"
            ErrorMessage="RegularExpressionValidator1"></asp:RegularExpressionValidator>
        To<asp:TextBox ID="txtTo" runat="server"></asp:TextBox>
        <asp:Button ID="Button1" runat="server" Text="Button" />
Avatar billede tjp Mester
21. december 2011 - 10:45 #5
Hvorfor så ikke bruge den anden som kun matcher de to?:

"^2011\-12\-24|2011\-12\-25$"

Kan for resten forkortes til:

"^2011\-12\-(24|25)$"
Avatar billede badal Nybegynder
21. december 2011 - 11:05 #6
Det er måske .net validerignskontrol som mather omvendt. HVis jeg bruger den her "^2011\-12\-24|2011\-12\-25$", så fejler den på andre datoer, f.eks. 2011-12-20, 2011-12-21, men den godtager  2011-12-24 og 2011-12-25. Her er koden:

<asp:ValidationSummary ID="ValidationSummary1" EnableClientScript="true" runat="server" />
        <asp:RegularExpressionValidator ValidationExpression="^2011\-12\-24|2011\-12\-25$" 
            ControlToValidate="txtTo" ID="RegularExpressionValidator1" runat="server" Text="*"
            ErrorMessage="RegularExpressionValidator1"></asp:RegularExpressionValidator>
        To<asp:TextBox ID="txtTo" runat="server"></asp:TextBox>
        <asp:Button ID="Button1" runat="server" Text="Button" />
Avatar billede tjp Mester
21. december 2011 - 11:24 #7
Øh, var det ikke problemet i #4 at den anden matchede valide datoer? Citat: "Den virker ikke helt da den matcher på alle valide datoer"... :-)
Avatar billede badal Nybegynder
21. december 2011 - 12:00 #8
Den anden "(?=^\d{4}\-\d{2}\-\d{2}$)(?!2011\-12\-24|2011\-12\-25)" virker korrekt når jeg tester den her: http://www.regular-expressions.info/javascriptexample.html

Det er ovenstående som regex som jeg skal have til at virke.

Måske er det .NET, der fortolker regex på sin egen måde? Her er .NET koden.
<asp:ValidationSummary ID="ValidationSummary1" EnableClientScript="true" runat="server" />
        <asp:RegularExpressionValidator ValidationExpression="(?=^\d{4}\-\d{2}\-\d{2}$)(?!2011\-12\-24|2011\-12\-25)" 
            ControlToValidate="txtTo" ID="RegularExpressionValidator1" runat="server" Text="*"
            ErrorMessage="RegularExpressionValidator1"></asp:RegularExpressionValidator>
        To<asp:TextBox ID="txtTo" runat="server"></asp:TextBox>
        <asp:Button ID="Button1" runat="server" Text="Button" />
Avatar billede badal Nybegynder
21. december 2011 - 13:41 #9
jeg mente at den ikke virker i .net, men virker på siden http://www.regular-expressions.info/javascriptexample.html
Avatar billede tjp Mester
21. december 2011 - 14:18 #10
Nå, okay.. :-)
Måske understøtter .Net ikke 'negative lookahead' som sådan??
Umiddelbart ser det ud til at det gør - i hvert fald på Server-siden...
Avatar billede badal Nybegynder
21. december 2011 - 14:23 #11
Ok kom bare med et svar. Det er den løsning jeg eftersøgte.

Så jeg tror at det er ikke en fejl i Regex, men i stedet for .NET, der skal gøres noget ved.
Avatar billede tjp Mester
21. december 2011 - 15:04 #12
Well, alternativt ku man jo lave et regexp der matcher alle datoer pånær de to uønskede:

"([013-9]\d{3}|20[02-9]\d|201[02-9])\-\d{2}\-\d{2}|2011\-((0\d|1[01])-\d{2}|12-([013]\d|2[0-36-9]))"

Tager ikke højde for ugyldtige datoer som 2011-12-32 og 2001-13-54...
Bør nok fanges af endnu en RegularExpressionValidator
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

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