• (cs) in reply to qbolec
    qbolec:
    I think we need a library, that allows us to describe regular languages using productions, and at compile time compiles it to regexp (or even to automata).

    I mean something like:

    const DateRegExp = RegExp{
    UsualDay >= [1-9]|1\d|2[0-8],
    Month >= [1-9]|1[0-2],
    Year >= \d+,
    LongDay >= 29|30,
    [...]

    Date >= LeapYearBonus | OtherYearDate, };

    You may notice that my notation of gramar resembles context free grammar, but is actually regular, as I only use non-terminals defined previously. I also want to use negation and intersection, which still keeps me inside regular languages.

    Do you know a language+compiler that supports somthing like that?

    LISP of course supports it because it supports arbitrary compile-time computation. C++ also supports it, the expression template pattern is your friend, there are even libraries that implement it all for you -- say Boost Spirit.

  • (cs)

    Are you sure that's a regex? It might just be thinly disguised exploit shellcode.

  • (cs) in reply to Dude
    Dude:
    And reading the comment above mine, I see that I was wrong about the century rule as well. Just more reason why you should let the date library handle it.
    The real WTF is that there are software professionals who don't understand a piece of such basic general knowledge about how the standard fucking calendar is constructed.

    One of the first exercises given to prospective candidates for a job in my company is to write a short program for counting the number of days between two dates reported in the Gregorian calendar. Checking for accurate handling of leap years is one of the crucial factors. If you're as clueless about the world around you as not to understand that, you're too clueless to work for me.

  • L. (unregistered) in reply to Nick V
    Nick V:
    I do not see what the issue is, here. If you are doing client-side validation, which is always a good idea, using a regex to validate your date (by the way: this is a good regex to validate a date) is not a bad idea at all.

    Of course, in 2012: JQuery, Telerik, etc...

    I apologize but WTF this ain't.

    Erm... this is a regex to validate a date ... but good lmfao . who the hell hardcodes years and forgets about post 2100... if you're going to hardcode it, do it till the end.

  • L. (unregistered) in reply to Ani Moose
    Ani Moose:
    ThingGuy McGuyThing:
    I really get the impression that this bit is supposed to detect leap-years:

    20(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)

    ...but I can't for the life of me find a corresponding 02/29 type of sequence.

    It's here: (0?[1-9]|[12][1-9]).(0?[123456789]|1[012]).20(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)

    You just can't have a Feb 10th or Feb 20th.

    Quick question though, why not use d at all ?

  • L. (unregistered) in reply to Matt Westwood
    Matt Westwood:
    Dude:
    And reading the comment above mine, I see that I was wrong about the century rule as well. Just more reason why you should let the date library handle it.
    The real WTF is that there are software professionals who don't understand a piece of such basic general knowledge about how the standard fucking calendar is constructed.

    One of the first exercises given to prospective candidates for a job in my company is to write a short program for counting the number of days between two dates reported in the Gregorian calendar. Checking for accurate handling of leap years is one of the crucial factors. If you're as clueless about the world around you as not to understand that, you're too clueless to work for me.

    Shh Westwood, we all know you're unemployed anyway - and a sock puppet of Zunesis, and we all know what zunie does to socks...

  • Nappy (unregistered) in reply to Dave
    Dave:
    TRWTF is having a national date format that puts Months first.

    Day Month Year has a logic to it, but is ordered the wrong way round for sorting.

    Year Month Day makes complete sense, and is sortable, (so long as the year is 4 digits - don't forget Y2K compliance!)

    But Month Day Year has neither logic nor sortability.

    The logic is in the way it is said. But if you have an international audience it's best to make it explicit i usually add (DD/MM/YYYY) and a picker so everybody knows for filename yyyymmdd makes the best sorting sense. And an other pain is the / . - used to separate the parts (and probably 16 other chars used)

  • codemonkey73 (unregistered) in reply to snoofle
    snoofle:
    KattMan:
    So what is wrong with trying a DateTime.TryParse and letting it either set a proper date for you or return false if it isn't valid? I actually think there is a problem with some people using regex for everything when it isn't needed. It's a tool with certian uses, it is not a swiss army knife for everything. Why re-invent the wheel?
    I can't speak for other languages, but in java, you can do: new SimpleDateFormat("yyyyMMdd").parse("20121143") and get Dec 13, 2012, which doesn't exactly let you know that the input was in/valid.

    Then the real WTF is java, this behaviour is completly brain dead so much so it is what javascript does as well.

  • (cs) in reply to lolwtf
    lolwtf:
    Are you sure that's a regex? It might just be thinly disguised exploit shellcode.
    Given the bulk of that thing, the one thing it isn't is thinly disguised. Can shellcode be “thickly disguised”?

    (Overall, all this WTF shows is that jwz was right when the regexp user doesn't know what they're doing. Depressing…)

  • (cs) in reply to snoofle
    snoofle:
    I can't speak for other languages, but in java, you can do: new SimpleDateFormat("yyyyMMdd").parse("20121143") and get Dec 13, 2012, which doesn't exactly let you know that the input was in/valid.
    I can't speak for you, but when i use an objet in java or other languages, i make sure to read an understand the documentation before claiming it won't work the way i want.
    By default, parsing is lenient: If the input is not in the form used by this object's format method but can still be parsed as a date, then the parse succeeds. Clients may insist on strict adherence to the format by calling setLenient(false)
  • Dave (unregistered) in reply to KattMan
    KattMan:
    So what is wrong with trying a DateTime.TryParse and letting it either set a proper date for you or return false if it isn't valid? I actually think there is a problem with some people using regex for everything when it isn't needed. It's a tool with certian uses, it is not a swiss army knife for everything. Why re-invent the wheel?

    Sigh. You're new around here, aren't you?

  • Dave (unregistered) in reply to Nappy
    Nappy:
    Dave:
    But Month Day Year has neither logic nor sortability.
    The logic is in the way it is said.
    "The fourth of July, 1776"?
  • daef (unregistered) in reply to Ani Moose

    Submitter here :-)

    The reason that 20's were rejected was the reason I fell over that piece of shiny regex.

    There were about 5 other Versions of the same regex all over the Project - different Versions had different bugs (couldn't even find one that passed a simple Test I wrote just for fun)

    It was simply replaced by a DateTime.TryParse btw.

    And WTF-Joe isn't a coworker anymore - so it didn't help him to stay.

  • bb (unregistered) in reply to ThingGuy McGuyThing

    If so; The Y3k bug is here!

  • ¯\(°_o)/¯ I DUNNO LOL (unregistered) in reply to daef
    daef:
    There were about 5 other Versions of the same regex all over the Project - different Versions had different bugs (couldn't even find one that passed a simple Test I wrote just for fun)
    Ah, so I see that Joe was an adherent to the WET principle, too!

    It would have also caused problems if you wanted to localize to US M0/DD/YYYY format or ISO YYYY-MM-DD format.

  • F (unregistered) in reply to Maltz
    Maltz:
    ThingGuy McGuyThing:
    I really get the impression that this bit is supposed to detect leap-years:

    20(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)

    ...but I can't for the life of me find a corresponding 02/29 type of sequence.

    Beyond that, it's still wrong. 1900 wasn't a leap year.

    Leap years are every 4 years... except every 100... except every 400. So 1700, 1800, 1900 are not leap years, 1600, 2000, and 2400 are.

    However, as it only allows years in the range 2000-2099 in the first place, the fact that 1900 and 2100 aren't leap years is about as relevant as the fact that there was no year zero.

  • Shut up foo' (unregistered) in reply to The Mr. T Experience
    The Mr. T Experience:
    Zylon:
    Annon:
    frist (this is not spam)
    Wrong on both counts.
    Wow. Your so inciteful.

    It's "You're" and "insightful". Maybe you need a regex spell-checker.

  • Peter (unregistered) in reply to KattMan
    KattMan:
    Let regex do what it does best, validate the PATTERN matches one of the following: "99/99/9999", "99-99-9999", "9999/99/99" or "9999-99-99", this is easy and accounts for day, month or year first.
    Does this mean that you think 1/1/2012 (say) should be rejected as invalid?
  • (cs) in reply to big picture thinker
    big picture thinker:
    Don't know why the entire validation is regex. You could use it for parts, but I think it would be better to split the year, month, and date parts and then perform some procedural logic on those parts.
    Absolutely, and who could argue with code that looks like this:
    def valiDate(dateStr):
      """Checks that the given date string matches the date format dd.mm.yyyy (leading zeros optional, only accepts dates in the 21st century, but includes leap year validations for all dates between 2000 and 2099, including 2000! (which makes it tehcoolzor!))
    (I used to have this in a one-line regex by my manager said that it was too long and convoluted and that I should swap it out for procedural code, so I decided to write this in python because python has some nice string manipulashuns built-in and I can write it in fewr linez than if it we're c#)"""
      if dateStr.count('.') != 2:
        return False
      day, month, year = dateStr.split('.')
      if (len(day) == 2 and day[0] == '0' or len(day) == 1) and day[-1] in '123456789' or day[0] in '12' and day[1] in '123456789' or day[0] == '3' and day[1] in '01':
        if (len(month) == 2 and month[0] == '0' or len(month) == 1) and month[-1] in '13578' or month[0] == '1' and month[1] in '02':
          if len(year) == 4 and year[:2] == '20' and all(y in '1234567890' for y in year[2:]):
            return True
      if (len(day) == 2 and day[0] == '0' or len(day) == 1) and day[-1] in '123456789' or day[0] in '12' and day[1] in '123456789' or day == '30':
        if (len(month) == 2 and month[0] == '0' or len(month) == 1) and month[-1] in '13456789' or month[0] == '1' and month[1] in '012':
          if len(year) == 4 and year[:2] == '20' and all(y in '1234567890' for y in year[2:]):
            return True
      if (len(day) == 2 and day[0] == '0' or len(day) == 1) and day[-1] in '123456789' or day[0] == '1' and day[1] in '123456789' or day[0] == '2' and day[1] in '012345678':
        if (len(month) == 2 and month[0] == '0' or len(month) == 1) and month[-1] in '123456789' or month[0] == '1' and month[1] in '012':
          if len(year) == 4 and year[:2] == '20' and all(y in '1234567890' for y in year[2:]):
            return True
      if (len(day) == 2 and day[0] == '0' or len(day) == 1) and day[-1] in '123456789' or day[0] in '12' and day[1] in '123456789':
        if (len(month) == 2 and month[0] == '0' or len(month) == 1) and month[-1] in '123456789' or month[0] == '1' and month[1] in '012':
          if len(year) == 4 and year[:2] == '20' and year[2:] in ('00', '04', '08', '12', '16', '20', '24', '28', '32', '36', '40', '44', '48', '52', '56', '60', '64', '68', '72', '76', '80', '84', '88', '92', '96'):
            return True
      return False
    

    Procedural code is so much better than Regexes

  • Re: Simple Date Validation (unregistered)

    Typical WTF idiocy responses (at least those that weren't trolls). Validating a date is a two step operation. First, parse the string into numbers for month, day, and year. Second, ensure that the month, day, and year are a valid date. Trying to cram a two part operation into a single line is a guaranteed source of WTFs, typically done by programmers who got A's on all of their homework problems but are complete disaster's when it comes to real work on production systems.

  • asdf (unregistered) in reply to qbolec
    qbolec:
    I think we need a library, that allows us to describe regular languages using productions, and at compile time compiles it to regexp (or even to automata).

    I mean something like:

    const DateRegExp = RegExp{
      UsualDay >= [1-9]|1\d|2[0-8],
      Month >= [1-9]|1[0-2],
      Year >= \d+,
      LongDay >= 29|30,
      LongMonth >= [13-9]|1[0-2],
      LongerDay >= 31,
      LongerMonth >= [13578]|1[02],
      OtherYearDate >= LongerDay.LongerMonth.Year | LongDay.LongMonth.Year,
      OtherYearDate >= UsualDay.Month.Year,
      DivisibleBy4 >= (\d*([02468][048]|[13579][26])) and not 0.+,
      DivisibleBy100 >= \d*00 and not 0.+,
      DivislbleBy400 >= (DivisbleBy4)00 and not 0.+,
      LeapYear >= DivisibleBy400 or (DivisibleBy4 and not DivisibleBy100),
      LeapYearBonus >= 29.02.LeapYear,
      Date >= LeapYearBonus | OtherYearDate,
    };
    

    You may notice that my notation of gramar resembles context free grammar, but is actually regular, as I only use non-terminals defined previously. I also want to use negation and intersection, which still keeps me inside regular languages.

    Do you know a language+compiler that supports somthing like that?

    https://metacpan.org/module/Regexp::Grammars

  • Darkstar (unregistered) in reply to Nick V

    Using regular expressions to validate dates just isn't the right tool for the job. It is painstakinly complicated to make sure that all cases are covered.

    A quick brute force check of this code revealed that the 10th of every month isn't accepted as a valid date. Did you see that?

    This is just an example of why regular expressions shouldn't be used - they are great for validating syntax, but suck at validating semantics.

    Also, my check above doesn't cover all the invalid dates that this regex may accept as valid.

    The only sane approach is to extract day, month and year, and then do checks on them. It is more readable and doesn't open up for crazy flukes like then one above.

  • Darkstar (unregistered) in reply to asdf

    ...and Perl 6, of course.

  • (cs)

    Regex is only used to show off knowhow. In real life program I am yet to find any good use for it.

  • x (unregistered) in reply to airdrik
    airdrik:
    big picture thinker:
    Don't know why the entire validation is regex. You could use it for parts, but I think it would be better to split the year, month, and date parts and then perform some procedural logic on those parts.
    Absolutely, and who could argue with code that looks like this:
    def valiDate(dateStr):
      """Checks that the given date string matches...
    [snip]
      return False
    
    Procedural code is so much better than Regexes
    Comprehension failure.
  • Franz Kafka (unregistered) in reply to Nagesh
    Nagesh:
    Regex is only used to show off knowhow. In real life program I am yet to find any good use for it.

    I use it regularly (heh). But then, perl makes it easy.

  • Jay (unregistered) in reply to Peter
    Peter:
    KattMan:
    Let regex do what it does best, validate the PATTERN matches one of the following: "99/99/9999", "99-99-9999", "9999/99/99" or "9999-99-99", this is easy and accounts for day, month or year first.
    Does this mean that you think 1/1/2012 (say) should be rejected as invalid?

    My bank's website says that dates should be entered in the from "mm/dd/yyyy". And they mean it: If you enter a single digit for the month or the day, they reject the date as invalid.

  • (cs) in reply to Rajendra Kumar
    Rajendra Kumar:
    Dearest Pros, I am needing of program just like this. Only it should be having ANSI C99 codes. I am team leader at major South Asian company and it is important this be delivered to my direct reports. That way I can get back to drinking chai and smoking fags. Plz send to [email protected], it's URGENT!

    Nagesh's manager?

  • international smoking pedant (unregistered) in reply to ObiWayneKenobi
    ObiWayneKenobi:
    Rajendra Kumar:
    Dearest Pros, I am needing of program just like this. Only it should be having ANSI C99 codes. I am team leader at major South Asian company and it is important this be delivered to my direct reports. That way I can get back to drinking chai and smoking bidis. Plz send to [email protected], it's URGENT!

    Nagesh's manager?

    fixed some smoking shit

  • Remy Martin (unregistered)

    Dear sirs and madams,

    I regret to inform you of the untimely passing of Alex for the third time this week. As I will now be souly responsible for the content of this site, you can expect one article per week from this point forward. As I am lazy, however, I will not be changing the name.

    Sincerely yours,

    Remy Martin

  • It's a Cock! It's a Fist! It's Zunerman! (unregistered) in reply to Remy Martin
    Remy Martin:
    Dear sirs and madams,

    I regret to inform you of the untimely passing of Alex for the third time this week. As I will now be souly responsible for the content of this site, you can expect one article per week from this point forward. As I am lazy, however, I will not be changing the name.

    Sincerely yours,

    Remy Martin

    What's with putting "sirs" first? Any true gentleman makes sure his lady comes first.

    Before gagging her with his cock

  • FatherStorm (unregistered) in reply to The Mr. T Experience
    The Mr. T Experience:
    Zylon:
    Annon:
    frist (this is not spam)
    Wrong on both counts.
    Wow. Your so inciteful.
    I see what you did there... (Captcha: quibus -- dative and ablative plural of qui)
  • Friedrice The great (unregistered) in reply to It's a Cock! It's a Fist! It's Zunerman!
    It's a Cock! It's a Fist! It's Zunerman!:
    Remy Martin:
    Dear sirs and madams,

    I regret to inform you of the untimely passing of Alex for the third time this week. As I will now be souly responsible for the content of this site, you can expect one article per week from this point forward. As I am lazy, however, I will not be changing the name.

    Sincerely yours,

    Remy Martin

    What's with putting "sirs" first? Any true gentleman makes sure his lady comes first.

    Before gagging her with his cock

    Then "Remy" would have to come first.

  • AN AWESOME CODER (unregistered)

    After reading the comments, I've realized somthing. Some of you think way too hard about the solution and it's shittiness, without knowing the problem.

    There are really only 3 problems with this WTF, in descdending order:

    1.) It doesn't account for 10th and 20th dates (someone mentioned this earlier, I didn't confirm) 2.) It's a huge hard to maintain regex

    the dates thing comes first, because it means that #2 is true for no reason. You can't even say "at least it works".

    As far as it not detecting EVERY leap year, or not thinking < 1900 or > 2100 or dates, that doesn't matter. What if this code isn't to validate that ANY date is correct? It could be validating dates of jobs that this company has taken, which was founded in 2006. That means any job date before then is bad user input even if it's a valid date, and any date too far in the future is also probably bad.

    In the above case, the programmer made an assumption that any date this code would ever process should never be from the next century. I see no problem with that... if this crap code is still being used 90 years from now to validate order dates, something more major is wrong. Of course, it means in 2012 I can still enter a job with a date of 2080, which is bogus.

    WITH THAT SAID, it's still a WTF. But some of your solutions would actually be less effective at solving the problem, if the case is what I described above. Just use a date library.

  • (cs) in reply to Oblig
    Oblig:
    You have a problem.

    You decide to use a regex.

    Now you have 00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96 problems.

    Wrong. You now you have 04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96 problems.

  • L. (unregistered) in reply to Re: Simple Date Validation
    Re: Simple Date Validation:
    Typical WTF idiocy responses (at least those that weren't trolls). Validating a date is a two step operation. First, parse the string into numbers for month, day, and year. Second, ensure that the month, day, and year are a valid date. Trying to cram a two part operation into a single line is a guaranteed source of WTFs, typically done by programmers who got A's on all of their homework problems but are complete disaster's when it comes to real work on production systems.

    Show me on the doll where the programmers who got A's touched you.

  • abdullah (unregistered) in reply to Shut up foo'
    Shut up foo':
    The Mr. T Experience:
    Zylon:
    Annon:
    frist (this is not spam)
    Wrong on both counts.
    Wow. Your so inciteful.

    It's "You're" and "insightful". Maybe you need a regex spell-checker.

    You missed the point, obvious troll is trying to incite the grammar nazis.

  • (cs) in reply to AN AWESOME CODER
    AN AWESOME CODER:
    After reading the comments, I've realized somthing. Some of you think way too hard about the solution and it's shittiness, without knowing the problem.

    There are really only 3 problems with this WTF, in descdending order:

    1.) It doesn't account for 10th and 20th dates (someone mentioned this earlier, I didn't confirm) 2.) It's a huge hard to maintain regex

    the dates thing comes first, because it means that #2 is true for no reason. You can't even say "at least it works".

    As far as it not detecting EVERY leap year, or not thinking < 1900 or > 2100 or dates, that doesn't matter. What if this code isn't to validate that ANY date is correct? It could be validating dates of jobs that this company has taken, which was founded in 2006. That means any job date before then is bad user input even if it's a valid date, and any date too far in the future is also probably bad.

    In the above case, the programmer made an assumption that any date this code would ever process should never be from the next century. I see no problem with that... if this crap code is still being used 90 years from now to validate order dates, something more major is wrong. Of course, it means in 2012 I can still enter a job with a date of 2080, which is bogus.

    WITH THAT SAID, it's still a WTF. But some of your solutions would actually be less effective at solving the problem, if the case is what I described above. Just use a date library.

    Waiting to see how long it would take for someone who can count to read your comment?
  • Jay (unregistered) in reply to PiisAWheeL
    PiisAWheeL:
    AN AWESOME CODER:
    After reading the comments, I've realized somthing. Some of you think way too hard about the solution and it's shittiness, without knowing the problem.

    There are really only 3 problems with this WTF, in descdending order:

    1.) It doesn't account for 10th and 20th dates (someone mentioned this earlier, I didn't confirm) 2.) It's a huge hard to maintain regex

    the dates thing comes first, because it means that #2 is true for no reason. You can't even say "at least it works".

    As far as it not detecting EVERY leap year, or not thinking < 1900 or > 2100 or dates, that doesn't matter. What if this code isn't to validate that ANY date is correct? It could be validating dates of jobs that this company has taken, which was founded in 2006. That means any job date before then is bad user input even if it's a valid date, and any date too far in the future is also probably bad.

    In the above case, the programmer made an assumption that any date this code would ever process should never be from the next century. I see no problem with that... if this crap code is still being used 90 years from now to validate order dates, something more major is wrong. Of course, it means in 2012 I can still enter a job with a date of 2080, which is bogus.

    WITH THAT SAID, it's still a WTF. But some of your solutions would actually be less effective at solving the problem, if the case is what I described above. Just use a date library.

    Waiting to see how long it would take for someone who can count to read your comment?

    There are 3 kinds of people in the world: those who can count, and those who can't.

  • Jay (unregistered) in reply to abdullah
    abdullah:
    Shut up foo':
    The Mr. T Experience:
    Zylon:
    Annon:
    frist (this is not spam)
    Wrong on both counts.
    Wow. Your so inciteful.

    It's "You're" and "insightful". Maybe you need a regex spell-checker.

    You missed the point, obvious troll is trying to incite the grammar nazis.

    He's very incitefull: he's always inciting trouble.

  • (cs) in reply to Jay
    Jay:
    PiisAWheeL:
    AN AWESOME CODER:
    Snipped for space...
    Waiting to see how long it would take for someone who can count to read your comment?
    There are 3 kinds of people in the world: those who can count, and those who can't.
    Or the 10 types, the ones who understand binary and the ones who don't?
  • L. (unregistered) in reply to PiisAWheeL
    PiisAWheeL:
    Jay:
    PiisAWheeL:
    AN AWESOME CODER:
    Snipped for space...
    Waiting to see how long it would take for someone who can count to read your comment?
    There are 3 kinds of people in the world: those who can count, and those who can't.
    Or the 10 types, the ones who understand binary and the ones who don't?
    Or the 99 types, because stfu ?
  • daef (unregistered) in reply to It's a Cock! It's a Fist! It's Zunerman!
    It's a Cock! It's a Fist! It's Zunerman!:
    What's with putting "sirs" first? Any true gentleman makes sure his lady comes first.

    Before gagging her with his cock

    i see what you did there :-)

    captcha: suscipere

  • Sorpigal (unregistered) in reply to qbolec

    I recommend that you read up on perl6 and specifically perl6 grammars and rules.

    Example lifted from wikipedia:

    token word { \w+ }
    rule phrase { <word> [ \, <word> ]* \. }
    if $string ~~ / <phrase> \n / {
      ...
    }
    
  • cousteau (unregistered)

    That 20(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96) must have something to do with leap years. Yeah, some basic algebraic operations would have been fine too, but that's cooler.

Leave a comment on “Simple Date Validation”

Log In or post as a guest

Replying to comment #:

« Return to Article