正则表达式年龄验证

时间:2010-06-10 16:52:52

标签: c# regex

任何人都有一个很好的年龄验证正则表达式?

我有一个日期字段,我在其中验证用户输入的是日期。

基本上我想知道该日期是否有效,然后进一步将日期细化为x年内

也许这可能太复杂了,无法解决我所做的任何事情,但我认为不会这样。

^([1][012]|[0]?[1-9])[/-]([3][01]|[12]\d|[0]?[1-9])[/-](\d{4}|\d{2})$

5 个答案:

答案 0 :(得分:3)

我是正则表达式的狂热粉丝,当然可以使用正则表达式来检查“合法范围”的日期。

<强> BUT:

匹配一个有效的日期(没有花哨的东西,如检查闰年)是相当微不足道的,但正则表达式令人厌烦 - 一个构建像RegexMagic这样的正则表达式的工具将很快为你做到这一点:

(?:0?2[/.-](?:[12][0-9]|0?[1-9])|(?:0?[469]|11)[/.-](?:30|[12][0-9]|0?[1-9])|(?:0?[13578]|1[02])[/.-](?:3[01]|[12][0-9]|0?[1-9]))[/.-][0-9]{4}

是RegexMagic为MM / DD / YYYY日期验证生成的,而不对日期范围施加限制(即02/31/2020不匹配,01/31/4500将会)。

这已经很难看,如果你是继承这段代码的人,可能很难弄明白。

第二个问题,即针对预定义的日期范围进行验证甚至更加困难。它可以完成,但

  1. 您需要更改正则表达式 每一天 - 毕竟,每一天 那天,有人满18岁,不是吗? 以及

  2. 正则表达式会变得更加笨拙。允许从06/10/1992到 06/10/2010,你得到

  3. 这个正则表达式的怪物。

    0?6[/.-](?:30|[12][0-9])[/.-]1992|(?:(?:0?9|11)[/.-](?:30|[12][0-9]|0?[1-9])|
    (?:0?[78]|1[02])[/.-](?:3[01]|[12][0-9]|0?[1-9]))[/.-]1992|0?6[/.-](?:10|0?[1-9])
    [/.-]2010|(?:0?2[/.-](?:[12][0-9]|0?[1-9])|0?4[/.-](?:30|[12][0-9]|0?[1-9])|0?
    [135][/.-](?:3[01]|[12][0-9]|0?[1-9]))[/.-]2010|(?:0?2[/.-](?:[12][0-9]|0?[1-9])|
    (?:0?[469]|11)[/.-](?:30|[12][0-9]|0?[1-9])|(?:0?[13578]|1[02])[/.-](?:3[01]|
    [12][0-9]|0?[1-9]))[/.-](?:200[0-9]|199[3-9])
    

    (包括“清晰度”的换行符。)

    明天,你需要

    0?6[/.-](?:30|2[0-9]|1[1-9])[/.-]1992|(?:(?:0?9|11)[/.-](?:30|[12][0-9]|0?[1-9])|
    (?:0?[78]|1[02])[/.-](?:3[01]|[12][0-9]|0?[1-9]))[/.-]1992|0?6[/.-](?:1[01]|0?[1-9])
    [/.-]2010|(?:0?2[/.-](?:[12][0-9]|0?[1-9])|0?4[/.-](?:30|[12][0-9]|0?[1-9])|0?
    [135][/.-](?:3[01]|[12][0-9]|0?[1-9]))[/.-]2010|(?:0?2[/.-](?:[12][0-9]|0?[1-9])|
    (?:0?[469]|11)[/.-](?:30|[12][0-9]|0?[1-9])|(?:0?[13578]|1[02])[/.-](?:3[01]|
    [12][0-9]|0?[1-9]))[/.-](?:200[0-9]|199[3-9])
    

    注意细微差别?

    简而言之,正如其他所有人都指出的那样:这不是你想要使用正则表达式的东西。即使你可以。

答案 1 :(得分:1)

<label><input type="checkbox" name="old_enough" value="you betcha!" /> I am old enough to visit this website.</label>

正则表达式:^you betcha!$

这不是正则表达式的任务。

编辑:关于您的编辑...为什么尝试类似

^([1][012]|[0]?[1-9])[/-]([3][01]|[12]\d|[0]?[1-9])[/-](\d{4}|\d{2})$

当你可以做的时候

if($age >= $minimum) { // verified! }

如果你过生日,你可以先做这样的事情,把生日转换为时间戳(这里使用PHP):

$minimum = strtotime('-13 years');
$age = strtotime('YYYY-MM-DD');

答案 2 :(得分:1)

许多人似乎犯了一个错误(查看此标记中的活动!):您有一个目标(在这种情况下,年龄验证),并且决定它必须用regexen完成。我不确定为什么人们会这样做 - 这并不像regexen是一种解决你所有问题的灵丹妙药。更好的问题要么是:(a)“我应该如何进行年龄验证?我想的可能是正则表达式,但我不确定如何写一个,”或者(b)“我正在使用技术XYZ,我需要执行年龄验证;因为XYZ的结构是PQR,我需要使用正则表达式,但我不知道如何写一个。“

所以如果你处于情况(a),我会这样说:为什么要使用正则表达式?我不确定你是如何得到你的意见的,但似乎有两种情况。如果你得到一个整数值,它只是从你得到它的任何地方读取它,将其转换为整数(例如,通过Java的Integer.parseInt(myStringInput)) ,然后检查整数是否在return (18 < age) ? true : false之类的范围内。如果您的出生日期(如“年,月,日”所示),那么:读取年,月和日;将它们转换为整数;使用它们来创建Date类的实例;并使用其方法测量时间之间的距离(同样,这取决于您的语言)。

另一方面,如果你处于情况(b)......呃。是的,这将是令人发指的。如果你处于单整数的情况下,它应该是可行的。如果你想匹配年龄大于或等于18的年龄,你应该做^(1[8-9]|[2-9]\d|\d{3,})$:18,19,年龄超过青少年的任何两位数年龄,或者三位或更多年龄。如果你想在18岁以下匹配,那么你需要^(\d|1[0-7])$。如果你处于生日状态,虽然......再次,呃。我不确定我是怎么接近它的。我希望你不是。这绝对可行;我认为正确的方法是做上面这样的事情。匹配now-18之前的所有年份;如果年份为now-18,请做几个月相似的事情;如果月份是相同的,那么做几天相似的事情。但我希望你不是在这种情况下。

编辑1:您说您已经为假定regexen的字段编写了某种验证结构。虽然我知道为什么会让你想要使用它们,但它会限制你可以验证的东西(肯定是你可以灵活地验证的)。或许传递一个回调函数更有意义,这可以让你处理regexen或类似的东西。

答案 3 :(得分:1)

如果您不能使用其他方法,您是否至少可以计算目标出生日期与现在之间的天数,然后只需验证this?它会简化必须动态生成日期范围的最高端,例如[0-minmonthfirstdigit] [0-minmonthseconddigit]等...

答案 4 :(得分:0)

检查年龄是否在1-109之间

([1-9][0-9]?)¦(10[1-9])