提问人:hakan 提问时间:9/9/2008 最后编辑:Sebastian Simonhakan 更新时间:7/30/2020 访问量:8064
日期时间格式的动态正则表达式
Dynamic regex for date-time formats
问:
是否有现有的解决方案可以从给定的日期时间格式模式动态创建正则表达式?支持的日期时间格式模式无关紧要(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 编码
评论
我猜你有一个有限的字母表,你的时间格式可以用来构建。这意味着,始终是 24 小时制上的“小时”,始终是前导为零的日期,依此类推。"HH"
"dd"
由于时间格式的顺序性质,您可以尝试将 的格式字符串标记化为数组。然后继续通过替换 with 等从该数组中形成一个模式字符串。将这些模式原子预构为查找表/数组。数组中不在查找表中的所有部分都是文本。根据正则表达式规则对它们进行转义,并将它们附加到您的模式字符串中。"dd/mm/yyyy HH:nn"
["dd", "/", "mm", "/", "yyyy", " ", "HH", ":", "nn"]
"HH"
"([01][0-9]|2[0-3])"
编辑:作为基于正则表达式的解决方案的副作用,当您将查找表的所有正则表达式“原子”放入 parens 并在给定格式字符串中跟踪它们的顺序时,您将能够使用子匹配项从匹配项中提取所需的组件并将它们输入到 CreateDate 函数中,从而完全跳过 ParseDate 部分。
评论
下面给出的 js / jQuery 代码仅适用于 Date 格式的动态生成的正则表达式,不适用于 DateTime(开发版本尚未完全测试)。
日期格式应为“D M Y”。
例如
- DD-MM-YY
- 日-月-年
- YYYY-MM-DD型
- YYYY-DD-毫米
- 月-日-年
- MM-DD-YY
- DD/MM/YY
- 日/月/年/年
- YYYY/月/日(YYYY/MM/DD)
- YYYY/DD/月度
- 月/日/年/年
- MM/DD/YY
或其他格式,但使用“D M Y”字符创建:
var dateFormat = "DD-MM-YYYY";
var order = [];
var position = {"D":dateFormat.search('D'),"M":dateFormat.search('M'),"Y":dateFormat.search('Y')};
var count = {"D":dateFormat.split("D").length - 1,"M":dateFormat.split("M").length - 1,"Y":dateFormat.split("Y").length - 1};
var seprator ='';
for(var i=0; i<dateFormat.length; i++){
if(["Y","M","D"].indexOf(dateFormat.charAt(i))<0){
seprator = dateFormat.charAt(i);
}else{
if(order.indexOf(dateFormat.charAt(i)) <0 ){
order.push(dateFormat.charAt(i));
}
}
}
var regEx = "^";
$(order).each(function(ok,ov){
regEx += '(\d{'+count[ov]+'})'+seprator;
});
regEx = regEx.substr(0,(regEx.length)-1);
regEx +="$";
var re = new RegExp(regEx);
console.log(re);
注意:月/天没有验证检查
例如,月份应为 01-12 或日期应为 01-31
评论