Skip to main content
 首页 » 编程设计

c#之正则表达式年龄验证

2024年01月29日27Free-Thinker

谁有用于年龄验证的良好正则表达式?

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

基本上我想弄清楚那个日期是否有效,然后进一步细化日期使其在 x 年内

也许这可能太复杂而无法附加到我所拥有的任何东西上,但我认为它不会。

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

请您参考如下方法:

我是正则表达式的忠实拥护者,当然可以使用正则表达式检查日期是否在“合法范围”内。

但是:

匹配一个有效日期(没有像检查闰年这样花哨的东西)是相当微不足道的,但对于正则表达式来说却很烦人 - 一个用于构建像 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,你得到

这个正则表达式的怪物。

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]) 

注意到细微差别了吗?

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