【问题标题】:How to validate ISO8601 date using regular expression? [duplicate]如何使用正则表达式验证 ISO8601 日期? [复制]
【发布时间】:2020-09-26 17:00:18
【问题描述】:

我的网络编程课程作业有问题,我应该在 javascript 中使用正则表达式来验证日期输入,我的返回是 ISO8601 格式。

这是我使用的表达式 /^(\d{4})-(\d{2})-(\d{2})$/

到目前为止,即使日期正确,它仍然作为无效日期返回。 here's the regular expression 在 notepad++ 中的样子。

The value for the date input 根据控制台返回为“2020-09-26”

我正在使用

var order_date = "2020-09-26"

var regDate = new RegExp('^(\d{4})-(\d{2})-(\d{2})$');
    
if (!regDate.test(order_date)){
        valid = false;
        document.getElementById("err5").innerHTML = "** Not a valid date";
    }

检查输入字段的值,如果它无效,则将有效变量设置为 false 并将错误消息添加到 HTML 中的错误范围。这是我的编辑器中代码本身的屏幕截图。

在我尝试使用正则表达式之前,语句是

if(order_date === "" || order_date.length < 8 || order_date.length > 10)){
        valid = false;
        document.getElementById("err5").innerHTML = "** Not a valid date";
    }

它在技术上是有效的,它可以接受 ISO8601 格式的日期并判断它是否合适并返回有效,但显然这个检查可以接受无效的日期,所以我们被告知使用正则表达式来改进检查。

只是需要一些帮助来了解为什么这不起作用。据我所知,正则表达式本身没有问题,所以也许是我的 javascript 的其余部分或其他问题?任何建议都有帮助

【问题讨论】:

  • 这能回答你的问题吗? regexp Parsing ISO-8601
  • 请使用regDate 分配和分配给order_Date 的示例值完成您问题中的代码,以便我们可以运行并重现您描述的问题。当您尝试使其在 JavaScript 中工作时,不确定为什么要谈论 notepad++。这使您的问题令人困惑。请专注于两者之一。
  • @trincot 我添加了 regDate 和 order_date 分配,order_date 只是一个示例值,因为它实际上从我正在使用的 html 表单中提取值,但它与我正在提取的值匹配从表格
  • @ChristianBaumann 看起来不像,似乎他的问题是检查日期结束时的时间,但我试图验证的值没有时间。从我一直在阅读的内容来看,正则表达式似乎很好,所以这可能是我缺少的 js 的问题?
  • 问题是new RegExp('/^(\d{4})-(\d{2})-(\d{2})$/');。它必须是regDate = new RegExp('^(\\d{4})-(\\d{2})-(\\d{2})$');(将字符串文字传递给new RegExp)或-更好-只是regDate = /^(\d{4})-(\d{2})-(\d{2})$/;(正则表达式文字)。

标签: javascript regex validation


【解决方案1】:

2020-09-26 格式应使用/^\d{4}-\d{2}-\d{2}$/ 进行验证,请务必先修剪日期。

const validateDate = (dateString) => {
  const regex = /^(?<y>\d{4})-(?<m>\d{2})-(?<d>\d{2})$/;
  const result = regex.exec(dateString || '2020-09-26');

  if (!result) {
    return false;
  }

  const { y, m, d } = result.groups;
  console.log(y, m, d);

  if (false /* write your days per months checks here */) {
    return false;
  }

  return true;
};

【讨论】:

  • (\d{4})-(\d{2})-(\d{2})^\d{4}-\d{2}-\d{2}$ 有何不同?
  • 可能是你使用的方式,我已经更新了我的答案,请查收,
  • 它与 OP 使用的正则表达式基本相同(在 Notepad++ 中工作得很好) - 我认为我们在问题中没有足够的信息。
  • @ScottWeaver 还有哪些信息可以提供帮助?这是我在网站上的第一个问题,我之所以这么问,是因为我似乎在其他任何地方都找不到答案。
  • @ScottWeaver 我认为导致问题的原因是“但显然这个检查可以接受无效的日期”所以,虽然显示的正则表达式测试 nnnn-nn-nn 字符串 - 没有什么是检查它是否是有效日期,而不是“0000-11-99”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 2011-05-16
  • 2013-04-22
相关资源
最近更新 更多