2016-03-08 183 views
0

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

第二个问题是否可以有一个通用的正则表达式,我可以用于多个日期范围,只用正常范围替换正则表达式中的几个值,而正则表达式继续验证日期范围,但与新的范围。预先感谢帮助=)

+2

不要使用正则表达式,从字符串中创建一个日期对象并使用API​​检查范围。 – Maroun

+1

正则表达式用于验证数据的语法,而不是其值。用逗号分隔,解析LocalDate,使用'isBetween(start,end)'。 – Dariusz

+0

使用正则表达式验证日期范围是一个非常糟糕的主意。简单的一年验证可能会像[this regex]一样(http:// stackoverflow。COM /问题/ 35825374/PostgreSQL相关的正则表达式替换/ 35825591)。 – 2016-03-08 13:31:24

回答

0

不要使用正则表达式

正如注释状态,正则表达式是不恰当的日期范围,也没有任何时间跨度。从仅考虑文本的语法而不考虑语义(含义)的意义上来说,正则表达式的意图是“愚蠢的”。

java.time

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

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

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

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

请注意,我们通常在日期时间工作中使用Half-Open方法,其中开头是包含性的,而结尾是排他性的。

这些问题已经在堆栈溢出的许多其他问题和答案中进行了介绍。所以我在这里缩小了我的讨论范围。

0

只是为了完整:您实际上可以使用正则表达式来识别任何有限的字符串集合,例如特定的日期范围,但它比实际推荐的用法更像是一次学术练习。 但是,如果你碰巧正在编程一些神秘的硬件,它实际上可能是必要的。

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

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

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 | ...),应用您使用的正则表达式实现的转义,然后您有日期检查器。如果输入不能保证是有效的日期,它会变得更复杂一些,但仍然有可能。