使用正则表达式检查dd-mmm-yyyy格式的jQuery数据格式

3

我需要检查日期格式是否为 dd-mm-yyyy 格式。

我正在使用以下内容:

if (ValidateDate() == false) {
   alert("Wrong Date Format");
return false;
}

function ValidateDate() {

    var dtValue = $('#txtEnteredStartDate').val();
    var dtRegex = new RegExp("^(([1-9]|0[1-9]|1[0-9]|2[1-9]|3[0-1])[-]([JAN|FEB|MAR|APR|MAY|JUN|JULY|AUG|SEP|OCT|NOV|DEC])[-](d{4}))$");
    return dtRegex.test(dtValue);
}

但是当我在字段中输入dd-mmm-yyyy,例如19-Nov-2015时,我收到错误信息:日期格式错误

我做错了什么?


@gene '#txtEnteredStartDate' 是一个 input type="date" 元素吗? - guest271314
仅使用正则表达式是不够的,例如它无法验证不同月份的天数。例如31-Feb-2015会通过验证,但是这样的日期并不存在。您需要解析日期字符串,创建一个Date对象,并比较它是否仍然是原始日期(例如,31 Feb会变成3 Mar - 不同的日期)。 - przno
使用正则表达式,您可以验证格式而不是值,这就是我想表达的意思。 - przno
我正在使用日历控件,并提供逻辑以禁止在输入字段中输入数据,除了“-”之外。此外,我只允许通过按退格键来删除数据。 - gene
3个回答

2
PhilVarg的正则表达式是正确的,但在RegExp中应用它时,你需要将d转义为\\d
另外,你可以将([1-9]|0[1-9]|1[0-9]|2[1-9]|3[0-1])重构为([0]?[1-9]|[1-2]\\d|3[0-1]),这意味着一个可选的0后面跟着1到9或1,2后面跟着一个数字,或者3后面跟着0或1。
最后一件事,[]不需要出现在-周围,并且为了忽略大小写,可以将i作为第二个参数传递给RegExp。
工作示例:

function ValidateDate() {
  var dtValue = $('#txtEnteredStartDate').val();
  var dtRegex = new RegExp("^([0]?[1-9]|[1-2]\\d|3[0-1])-(JAN|FEB|MAR|APR|MAY|JUN|JULY|AUG|SEP|OCT|NOV|DEC)-[1-2]\\d{3}$", 'i');
  return dtRegex.test(dtValue);
}

$('.check').click(function() {
  if (ValidateDate() == false) {
    $('.result').html("Wrong Date Format");
  } else {
    $('.result').html("Right Date Format");
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="txtEnteredStartDate" value="19-Nov-2015" />
<input type="button" class="check" value="check" />
<span class="result"></span>


0
我发现了另一种适合我的方法:
function ValidateDate(dtValue) {

    var dtRegex = new RegExp(/^\d\d?-\w\w\w-\d\d\d\d/);
    return dtRegex.test(dtValue);
}

感谢大家的建议


请小心处理,因为它将匹配 00-___-0000\w 匹配字母、数字和下划线。 - BenG
在我的情况下,我正在使用日历控件并提供逻辑来禁止除“ - ”以外的数据输入到输入字段中。此外,我只允许通过按退格键来删除数据。 - gene
1
@gene,你在结尾处漏了一个 $。@BG101,你是怎么猜到我的密码的? - Mike Samuel

0

你的正则表达式中有几个错误

首先,(d{4}) 需要改为 (\d{4}),因为它目前正在寻找 4 个 d,而需要寻找四个数字

其次,月份周围的括号导致它失败,因为它正在寻找一个单个字符 JANFEB 等等

最后,它需要是一个不区分大小写的正则表达式

以下正则表达式应该可以工作:

/^(([1-9]|0[1-9]|1[0-9]|2[1-9]|3[0-1])[-](JAN|FEB|MAR|APR|MAY|JUN|JULY|AUG|SEP|OCT|NOV|DEC)[-](\d{4}))$/i

如下所示这里


这真的很奇怪,但它不起作用。 - gene
你能否在控制台输出dtValue和dtRegex并确保它们是所需的输入吗? - PhilVarg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接