日期时间格式的动态正则表达式
时间:2020-03-05 18:50:06 来源:igfitidea点击:
是否存在现有解决方案,可以根据给定的日期时间格式模式动态创建正则表达式?支持的日期时间格式模式无关紧要(Joda DateTimeFormat,java.text.SimpleDateTimeFormat或者其他)。
也就是说,对于给定的日期时间格式(例如" dd / MM / yyyy hh:mm"),它将生成相应的正则表达式以匹配指定格式内的日期时间。
解决方案
回答
SimpleDateFormat
已经使用parse()
方法做到了这一点。
如果我们需要从一个字符串中解析多个日期,请以正则表达式开始(即使匹配过于宽松),并对正则表达式发现的所有可能匹配项都使用parse()
。
回答
如果我们正在寻找基本的日期检查。该代码与该数据匹配。
\b(0?[1-9]|[12][0-9]|3[01])[- /.](0?[1-9]|1[012])[- /.](19|20)?[0-9]{2}\b 10/07/2008 10.07.2008 1-01/2008 10/07/08 10.07.2008 1-01/08
通过regexbuddy编码
回答
我想我们可以构造时间格式的字母有限。这意味着," HH"在24小时制中始终是"小时"," dd"在前导零处始终是一天,依此类推。
由于时间格式具有顺序性质,因此我们可以尝试将格式为" dd / mm / yyyy HH:nn"的字符串标记为数组dd]," /"," mm"," / "," yyyy",""," HH",":"," nn"。然后继续,通过用"([[01] [0-9] | 2 [0-3])""替换" HH"来形成该数组的模式字符串,依此类推。将这些模式原子预先构建到查找表/数组中。数组中所有不在查找表中的部分都是文字。根据正则表达式规则将其转义,并将其添加到模式字符串。
编辑:作为基于正则表达式的解决方案的副作用,当我们将查找表的所有正则表达式"原子"放入括号中并以给定的格式字符串跟踪其顺序时,我们将能够使用子匹配项来提取匹配中需要的组件,并将其输入到CreateDate函数中,从而完全跳过了ParseDate部分。