我有这个示例字符串:
Sample string 1:
A^1.1#B^1#I^2#f^0#p^1#d^2010-07-21T08:52:05.222ZKHBDGSLKHFBDSLKFGNIF#%$%^$#^$XLGCREWIGMEWCERG
Sample string 2:
A^1.1#B^1#f^0#p^1#d^2010-07-22T07:02:05.370ZREGHCOIMIYR$#^$#^$#^EWMGCOINNNNNNVVVRFGGYVJ667VTG
所以,从这些字符串中,我需要取出时间戳:
2010-07-21T08:52:05.222 or
2010-07-22T07:02:05.370
基本上是值b / w d^ and Z
最好(“最聪明”)的方法是什么? substring(),regex?
答案 0 :(得分:4)
Pattern p = Pattern.compile("(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3})");
//you could also use "d\\^(.*)Z" as your regex patern
Matcher m = p.matcher("your string here");
if (m.find()) {
System.out.println(m.group(1)); //print out the timestamp
}
取自here
此外,如果您循环浏览一系列字符串,请确保重用Pattern p
对象
答案 1 :(得分:2)
有两个小假设,你可以在没有正则表达式的情况下完成。
^d
是文本中出现的第一个字符串。我认为分隔符总是意味着“日期紧随其后”。 只需获取起始^d
分隔符的索引,找出日期开始的位置,然后使用长度来获得结束索引。
public static void main(String[] args) {
String s1 = "A^1.1#B^1#I^2#f^0#p^1#d^2010-07-21T08:52:05.222ZKHBDGSLKHFBDSLKFGNIF#%$%^$#^$XLGCREWIGMEWCERG";
String s2 = "A^1.1#B^1#f^0#p^1#d^2010-07-22T07:02:05.370ZREGHCOIMIYR$#^$#^$#^EWMGCOINNNNNNVVVRFGGYVJ667VTG";
System.out.println( parseDate(s1) );
System.out.println( parseDate(s2) );
}
public static String parseDate(String s) {
int start = s.indexOf("d^") + 2;
int length = 23;
String date = s.substring(start, start + length);
return date;
}
输出:
2010-07-21T08:52:05.222
2010-07-22T07:02:05.370
答案 2 :(得分:0)
我会使用正则表达式,例如(\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d\.\d{3})
。
您可能希望获得更好的体验,并且在01-12之外的时间段内预防数月,在01-31等之外的几个小时,但是它应该足够好,因为您提供的样本数据也是如此。
如果日期始终以^ d为前缀,则子字符串可能有效,但我仍然认为正则表达式更清晰。