Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从这个字符串中解析出时间戳?_Java_Regex_String_Parsing - Fatal编程技术网

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/w
d^和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.222
    2010-07-22T07:02:05.370


    有了两个小假设,你就可以不用正则表达式了

  • 日期字符串前面的
    ^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


    我会使用正则表达式,类似于
    (\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:我要补充一点,如果您不能验证这两种假设对任何输入都是正确的,您一定要坚持使用正则表达式解决方案。