日期时间格式的动态正则表达式

Dynamic regex for date-time formats

提问人:hakan 提问时间:9/9/2008 最后编辑:Sebastian Simonhakan 更新时间:7/30/2020 访问量:8064

问:

是否有现有的解决方案可以从给定的日期时间格式模式动态创建正则表达式?支持的日期时间格式模式无关紧要(Joda 或其他)。DateTimeFormatjava.text.SimpleDateTimeFormat

作为一个具体的例子,对于给定的日期时间格式,如 ,它应该生成相应的正则表达式,以匹配指定格式内的日期时间。dd/MM/yyyy hh:mm

正则表达式 日期时间 信息检索

评论


答:

0赞 Jason Cohen 9/9/2008 #1

SimpleDateFormat已经使用该方法执行此操作。parse()

如果需要从单个字符串中解析多个日期,请从正则表达式开始(即使它匹配得太宽松),并对正则表达式找到的所有潜在匹配项使用。parse()

评论

0赞 hakan 9/9/2008
仅当给定文本与模式匹配并返回该字符串的 Date 对象表示形式时,它才会进行分析。它不会解析日期信息是否在其他文本中的某个位置。比如“sometext 12/03/2004 sometext.
0赞 Jason Cohen 9/10/2008
这可能是无法决定的。如果文本包含两个日期,例如“在 A 和 B 之间,等等”,其中 A 和 B 是日期......
0赞 hakan 9/11/2008
好吧,然后将它们作为两个组找到,就像正则表达式查找一样。
1赞 Keng 10/7/2008 #2

如果您要查找基本日期检查,则此代码将匹配此数据。

\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 编码

评论

0赞 hakan 10/8/2008
我需要的是给定 DateTimeFormat 的正则表达式生成器。我不知道给定语料库中使用的日期格式。因此,用户首先应该通过像 DDMM hh:mm 这样说 sth 来提供,我在文本中找到这些日期值。我使用 JFlex 创建了 sth。清理干净后,我也会在这里发布。
3赞 Tomalak 10/8/2008 #3

我猜你有一个有限的字母表,你的时间格式可以用来构建。这意味着,始终是 24 小时制上的“小时”,始终是前导为零的日期,依此类推。"HH""dd"

由于时间格式的顺序性质,您可以尝试将 的格式字符串标记化为数组。然后继续通过替换 with 等从该数组中形成一个模式字符串。将这些模式原子预构为查找表/数组。数组中不在查找表中的所有部分都是文本。根据正则表达式规则对它们进行转义,并将它们附加到您的模式字符串中。"dd/mm/yyyy HH:nn"["dd", "/", "mm", "/", "yyyy", " ", "HH", ":", "nn"]"HH""([01][0-9]|2[0-3])"


编辑:作为基于正则表达式的解决方案的副作用,当您将查找表的所有正则表达式“原子”放入 parens 并在给定格式字符串中跟踪它们的顺序时,您将能够使用子匹配项从匹配项中提取所需的组件并将它们输入到 CreateDate 函数中,从而完全跳过 ParseDate 部分。

评论

0赞 MSalters 10/8/2008
这工作得不错,但它相当以英语为中心。然后,“DDD”可能会映射到 (Mon|Tue|Wed|Thu|Fri|Sat|Sun),但您需要一个依赖于区域设置的映射。当日期格式生成非 ASCII 数字时,情况会变得更糟。有关 i18n 的更多详细信息,请参见 M.Kaplan 的博客。
0赞 hakan 10/8/2008
是的,这正是我需要的。我想做类似的事情,因为我找不到任何已经存在的东西。为了解析 dateTimeFormat,我使用了 jflex。因此,如果它是“d”,它应该匹配 1 或 2 位数字,或者如果它是“ddd”,它应该匹配 3 位数字,等等。但是,我仍然需要针对 i18n 对其进行改进。
0赞 hakan 10/8/2008
@MSalters。你能提供你提到的博客的链接吗?谢谢
0赞 Tomalak 10/8/2008
对于依赖于语言环境的模式,您可以进一步抽象它,并从语言的语言环境日期函数构造查找表。当然,事先了解您的约会对象所使用的语言是必需的,但这非常简单。
0赞 Tomalak 10/8/2008
请注意,“2 位数字”的“dd”将产生误报。“99”将匹配,但肯定不能作为“两位数年份”以外的日期成分。
0赞 Ankit Arjaria 12/28/2016 #4

下面给出的 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