【问题标题】:Java regex to validate range of datesJava 正则表达式来验证日期范围
【发布时间】:2016-06-22 11:08:57
【问题描述】:

我在为一系列日期生成正则表达式时遇到问题。 比如这个范围[2015-11-17, 2017-10-05],我该怎么办?使用正则表达式验证日期是否属于该范围。

第二个问题是否有可能有一个通用的正则表达式,我可以将它用于多个日期范围,只用我拥有的新范围替换正则表达式中的几个值,并且正则表达式继续验证一个日期范围,但是新的范围。在此先感谢您的帮助 =)

【问题讨论】:

  • 不要使用正则表达式,从字符串创建一个日期对象并使用 API 检查范围。
  • Regex 用于验证数据的语法,而不是其值。用逗号分割,解析LocalDate,使用isBetween(start,end)
  • 使用正则表达式验证日期范围是一个非常糟糕的主意。简单的年份验证最终可能会像this regex

标签: java regex date date-range


【解决方案1】:

不要使用正则表达式

正如 cmets 所述,Regex 不适用于一系列日期,也不适用于任何时间跨度。正则表达式旨在“愚蠢”,仅查看文本的语法而不是语义(含义)。

java.time

使用 Java 8 及更高版本中内置的 java.time 框架。

将您的字符串解析为LocalDate 对象。

LocalDate start = LocalDate.parse( "2015-11-17" );

通过调用 isEqual、isBefore 和 isAfter 方法进行比较。

请注意,我们通常在日期时间工作中使用半开式方法,其中开始包含在内,而结尾则排除在外。

这些问题已经在 Stack Overflow 上的许多其他问答中有所涉及。因此,我在这里缩短了我的讨论。

【讨论】:

    【解决方案2】:

    仅出于完整性考虑:您实际上可以使用正则表达式来识别任何有限的字符串集,例如特定的日期范围,但这更像是一种学术练习,而不是实际推荐的用法。 然而,如果你碰巧正在编程一些神秘的硬件,它实际上可能是必要的。

    假设输入始终是给定格式的有效日期,则示例的正则表达式可能包括:

    2015-0[1-9].* - 2015 年 1 月至 9 月

    2015-10.* - 2015 年 10 月

    2015-11-0[1-9] - 2015 年 11 月 1 日至 9 日

    2015-11-1[0-7] - 2015 年 11 月 10 日至 17 日

    2016.* - 2016 年的所有日期

    类似地添加 2017,使用 | 进行析取(a|b|c|...),应用您使用的正则表达式实现的转义,然后您就有了日期检查器。如果不能保证输入的日期是有效日期,它会变得有点复杂,但仍然可能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-24
      • 2017-10-06
      • 1970-01-01
      • 2011-05-16
      • 2013-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多