【发布时间】:2019-10-31 10:01:36
【问题描述】:
我正在尝试使用一些日期验证来更新旧应用,当用户在文本字段中键入它时。
我在这里有一个简单的演示 http://jsfiddle.net/7d82j0ky/2/ 如果你输入以下日期:
- 05/24/1972(有效)
- 2020 年 5 月 24 日(在这种情况下,年份无效,当前年份是我们最大的时间)
- 05/32/1972(在这种情况下是无效日期)
正则表达式有效,但在您输入完整的日期格式 MM/DD/YYYY 之前它无效。如果您打开浏览器控制台,您会在输入时看到控制台输出消息。
我希望验证用户键入时,所以每个字符,如果有无效字符,我想阻止该无效字符的默认行为,因此永远不会添加它,所以:
- 05/24 输入就可以了
- 05/32 不行,通过阻止该键事件的默认行为,这两个不应出现在 UI 中,因此您在键入时只会在文本字段中看到“05/3”
- 0a 不行,就像上面的“a”应该被阻止,这样您在输入时只会在文本字段中看到“0”。
在键入时匹配正则表达式的最佳方法是什么?
我在https://regex101.com/r/M8habw/1/ 有一些日期正则表达式的测试用例,根据我们在应用程序中关心的日期,它们似乎都运行良好。我不是非常擅长正则表达式,但这并不难。
这是满足在此处发布的 jsfiddle 代码:
<input class="input" type="text" maxlength="10" placeholder="MM/DD/YYYY"/>
$('.input').on('input', function(e) {
var regex = /^(0[1-9]|1[0-2])\/(0[1-9]|1\d|2\d|3[01])\/((19[2-9]\d{1})|20[0|1]\d{1})$/g;
if (!this.value.match(regex)) {
console.log('nope');
e.preventDefault();
} else {
console.log('yep');
}
});
【问题讨论】:
-
尝试
var regex = /^(?:0[1-9]?|1[0-2]?)(?:\/(?:(?:0[1-9]?|1\d?|2\d?|3[01]?)(?:\/(?:1(?:9(?:[2-9]\d?)?)?|2(?:0(?:[01]\d?)?)?)?)?)?)?$/;并与RegExp#test一起使用:if (!regex.test(this.value)) { -
关于如何验证日期已经有很多问题了。正则表达式并不特别适合您正在尝试做的事情,其他方法更简单且更易于维护。此外,在获得月份和年份之前,您无法验证日期部分。
-
我和@RobG 在一起。动态类型验证只会在用户完成输入之前抛出一堆错误——糟糕的用户体验。也许考虑使用一个日期选择器(比如来自 jQuery 的那个),然后在日期更改时进行验证。
标签: javascript jquery regex validation date