如何从此字符串解析出时间戳?
我有这样的样本串:如何从此字符串解析出时间戳?
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(),正则表达式?
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
对象,如果你通过一系列串
因为它总是在“d ^”和“Z”之间,所以只用d ^(。*?)Z和使用捕获组是不是更容易? – NorthGuard 2010-07-21 19:29:02
“d \\ ^(。*?)Z”也有效 – zengr 2010-07-21 19:36:44
@ fy-tide啊,你说的没错。编辑显示严格和简单的正则表达式模式。 – sigint 2010-07-21 19:41:03
两个小假设你可以不用正则表达式的循环。
-
^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
好的,所以从良好的编程习惯,是不是假设一个字符串的长度不好? – zengr 2010-07-21 19:54:05
@zengr:我必须假设它,因为我只有2个样本可供查看。你不应该假设它,你不应该。您应该能够找出该日期格式是否为固定长度。您接受的正则表达式也采用已知的格式。 – 2010-07-21 19:59:13
@zengr:我会补充一点,如果你无法验证这两个假设对于任何输入都是真的,你应该坚持使用正则表达式的解决方案。 – 2010-07-21 20:05:00
我会去与一个正则表达式,喜欢的事(\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d\.\d{3})
。
您可能希望获得更好的发现,并防止01-31之外的几个月,01-31之外的时间等几个小时,但它应该足够好,就像您提供的样本数据一样。
如果日期总是以^ d为前缀,子串可能会工作,但我仍然认为正则表达式更清晰。
这些例子看起来很像ISO8601格式,这可能会帮助您找到一个“内置”解析器。 – Freiheit 2010-07-21 19:29:07
你能不能使用我的头像? > _ 2010-07-21 20:03:01
@pavel lol,np,我没有看到你的头像上有一个“版权”,所以拿了它。 :) – zengr 2010-07-21 21:44:20