【问题标题】:Regex validation YYYY-MM-DD format正则表达式验证 YYYY-MM-DD 格式
【发布时间】:2020-04-09 16:24:40
【问题描述】:

我正在使用Regex 来验证日期格式(YYYY-MM-DD) 使用这个 gem(https://github.com/nicolasblanco/rails_param)

param! :start_date, Date, format: /([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))/, required: true, message: "Query start_date is not specified and invalid"

对于正确的日期格式,它也说错误 查询 start_date 未指定

示例查询 http://localhost:3005/data?start_date=2008-01-27&end_date=2009-01-27

没有用

【问题讨论】:

  • 另请注意,此验证即使具有正确的年份语法,也无法确保日期正确。您仍然可以收到2019-02-31,这不是一个存在但根据正则表达式有效的日期。仅使用正则表达式进行正确的日期验证非常复杂,您最好只检查广泛的一致性,然后使用日期库进行实际验证。
  • @Stefan 是的,我刚刚注意到那里的\d。我在你发帖前一秒删除了评论。
  • 为什么要验证日期的字符串格式?为什么不只解析它(无论如何你都这样做),如果解析器没有引发错误,那么接受它是正确的,如果解析器引发错误,那么你返回有用的错误消息?
  • 当且仅当DateTime.strptime(input, '%Y-%m-%d') 不引发异常时,该字符串才表示有效日期。因此,您需要在begin-rescue-end 子句中执行它(在'require 'date' 之后),并在抛出异常时捕获异常。对于要使用的正则表达式,它必须很复杂,部分原因是它必须实现确定一年是否为闰年的所有规则(例如,如果年份被 100 整除,则不是闰年,但不是 400)。不用说,正则表达式不是适合这里工作的工具。
  • 虽然我建议使用DateTime::strptime,但我谨慎使用Date#parse,这是出了名的不可靠。例如,如果parse 的参数(一个字符串)包含单词“may”或“march”(甚至是一个以“may”或“march”开头的单词,例如“marching”和“maybe”) ,它会尽职尽责地将字符串变成日期。

标签: ruby-on-rails regex ruby


【解决方案1】:

show result假设你是 validate 1900-2019

/^(19[0-9][0-9]|20[0-1][0-9])-(0[0-9]|1[0-2])-(0[0-9]|1[0-9]|2[0-9]|3[0-1])$/

【讨论】:

  • 我怀疑这是否有帮助甚至根本有效。为了说服我,请解释它是如何工作的以及它为什么有用。
【解决方案2】:

正确验证YYYY-MM-DD aka ISO8601 格式将是:

require 'date'
input = '2019-12-11'
Date.parse(input).to_s == input

不应为此使用正则表达式。

【讨论】:

    猜你喜欢
    • 2011-11-02
    • 2017-05-17
    • 1970-01-01
    • 2017-07-10
    • 2023-04-07
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多