首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正则表达式年龄验证

正则表达式年龄验证
EN

Stack Overflow用户
提问于 2010-06-11 00:52:52
回答 5查看 7.1K关注 0票数 1

谁有一个很好的正则表达式来验证年龄?

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

基本上,我想弄清楚该日期是否有效,然后进一步将该日期调整为x年数内。

也许这可能太复杂了,我已经知道的太多了,但我认为不会这样。

代码语言:javascript
复制
^([1][012]|[0]?[1-9])[/-]([3][01]|[12]\d|[0]?[1-9])[/-](\d{4}|\d{2})$
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-06-11 03:52:34

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

但是:

匹配一个有效的日期(没有检查闰年之类的花哨的东西)是相当琐碎的,但是使用正则表达式很麻烦-一个构建正则表达式的工具,如RegexMagic,将很快为您完成这项工作:

代码语言:javascript
复制
(?: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. 将变得更加笨拙。要允许从1992年6月10日到2010年10月6日之间的任何事件,您将获得

这个怪物的正则表达式。

代码语言:javascript
复制
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])

(包含换行符是为了“清晰”)。

明天,你需要

代码语言:javascript
复制
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])

注意到细微的区别了吗?

简而言之,正如所有其他人所指出的:这不是您想要使用正则表达式的东西。即使你能做到。

票数 4
EN

Stack Overflow用户

发布于 2010-06-11 00:57:08

代码语言:javascript
复制
<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):

代码语言:javascript
复制
$minimum = strtotime('-13 years');
$age = strtotime('YYYY-MM-DD');
票数 1
EN

Stack Overflow用户

发布于 2010-06-11 01:11:05

您正在犯很多人似乎都会犯的错误(看看这个标记中的活动!):您有一个目标(在本例中,是年龄验证),并且决定必须使用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或类似的事情。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3016575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档