Java 如何从这个字符串中解析出时间戳?
我有以下示例字符串:Java 如何从这个字符串中解析出时间戳?,java,regex,string,parsing,Java,Regex,String,Parsing,我有以下示例字符串: 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 因此,我需要从这些字符串中取出
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/wd^和Z值
最好的(“最聪明的”)方法是什么?子字符串(),正则表达式
取自
另外,如果要在一系列字符串中循环,请确保重用模式p
对象
取自
另外,如果要通过一系列字符串循环,请确保重用模式p
对象,只要有两个小假设,就可以不用正则表达式
日期字符串前面的^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.2222010-07-22T07:02:05.370
有了两个小假设,你就可以不用正则表达式了
^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.2222010-07-22T07:02:05.370
我会使用正则表达式,类似于
(\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d\.\d{3})
你可能想变得更时尚,并防止在01-12范围外的几个月,01-31范围外的几天等几个小时,但这应该足够好了,因为你提供了示例数据
如果日期总是以^d作为前缀,子字符串可能会起作用,但我仍然认为正则表达式更干净。我会使用正则表达式,类似于
(\d{4}-\d\d-\d\d\dT\d\d:\d\d:\d\d\.\d{3})
你可能想变得更时尚,并防止在01-12范围外的几个月,01-31范围外的几天等几个小时,但这应该足够好了,因为你提供了示例数据
如果日期总是以^d作为前缀,子字符串可能会起作用,但我仍然认为正则表达式更干净。因为它总是在“d^”和“Z”之间,所以只做d^(.*Z)并使用捕获组不是更容易吗?@fy tide啊,你是对的。编辑以显示严格和简单的正则表达式模式。因为它总是在“d^”和“Z”之间,所以只做d^(.*Z)并使用捕获组不是更容易吗?@fy tide啊,你是对的。编辑以显示严格和简单的正则表达式模式。示例看起来像是非常常见的ISO8601格式,这可能会帮助您找到“内置”解析器。请不要使用我的化身?!>_@pavel lol,np,我没有在你的头像上看到“版权”,所以就拿走了。:)谢谢:-)顺便说一句,你的鸭子很酷。这些例子看起来像是非常常见的ISO8601格式,这可能会帮助你找到一个“内置”解析器。你能不能不要使用我的化身?!>_@pavel lol,np,我没有在你的头像上看到“版权”,所以就拿走了。:)谢谢:-)顺便说一句,你的鸭子很酷。好吧,从良好的编程实践来看,假设字符串的长度不是很糟糕吗?@zengr:我不得不假设它,因为我只有两个示例要看。你不应该假设,你也不应该这么做。您应该能够确定该日期格式是否为固定长度。您接受的正则表达式也采用了已知的格式。@zengr:我要补充一点,如果您无法验证这两种假设对任何输入都是正确的,您一定要坚持使用正则表达式解决方案。好的,从良好的编程实践来看,假设一个字符串的长度不是很糟糕吗?@zengr:我不得不假设它,因为我只有两个样本要看。你不应该假设,你也不应该这么做。您应该能够确定该日期格式是否为固定长度。您接受的正则表达式也采用了已知的格式。@zengr:我要补充一点,如果您不能验证这两种假设对任何输入都是正确的,您一定要坚持使用正则表达式解决方案。