示例字符串:
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
是可选的。
有什么建议吗?
答案 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)