Java - 用于匹配日期和时间的高效正则表达式

时间:2017-02-16 08:20:53

标签: java regex

示例字符串:

  

00000018.000f1b1f 0101559e 2016年5月19日星期四00:24:14 -05:00 [k ....

......提到不需要的词语。

如果我们按空格划分,则没有像Thu这样的规范总是第三个字符串。它可以在字符串中的任何位置。我希望匹配Thu May 19 2016 00:24:14 -05:00并使用simpedateformat类进行解析。

我正在考虑像.*?((sun|mon|tue|wed|thu|fri|sat)\s* (jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\s+\d{0,2}\s+\d{0,4}\s+\d{0,2}\:\d{0,2}\:\d{0,2}\s+([+|-]\d{0,2}:\d{0,2})?).*?

这样的正则表达式

我不擅长正则表达式。请帮助我改进我的正则表达式,simpledateformat类可以轻松解析。 -05:00是可选的。

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

您的正则表达式看起来没问题,但您可以通过将搜索限制为单个空格和固定位数来提高性能

(?i)\b((sun|mon|tue|wed|thu|fri|sat) (jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec) \d{1,2} \d{4} \d{2}\:\d{2}\:\d{2}( [+|-]\d{2}:\d{2})?)

然后你可以循环搜索它(while (matcher.find()) ...

请记住,日期格式取决于应用程序区域设置。期望某种格式会使您的应用程序变得脆弱。

答案 1 :(得分:1)

如果您不想使用正则表达式,那么您可以依赖SimpleDateFormat在匹配后忽略内容的事实,因此以下内容将起作用

    String in = "00000018.000f1b1f 0101559e 2016/12/14 12:34 [k....";

    SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm");

    while (in.length() > 0)
    try {
        System.out.println(df.parse(in));
        break;
    }
    catch (Exception ee) {
        in = in.substring(1);
    }

注意

当然,将上面的面具更改为所需的面具

答案 2 :(得分:0)

您需要支持所有3种日期格式吗? 即:

dd.mm.yyyy - European (day-of-month, month, year)
mm/dd/yyyy - US (month, day-of-month, year)
yyyy-mm-dd - Scandinevian (year, month, day-of-month)