日期的子串

时间:2015-04-16 10:58:18

标签: java regex string

你好,我有一个像这样的字符串:6-006.a9&&20130323^000~1-206&&20130329^000~1-208.2&&20130322^000 我想把日期拿出来。我有一个有效的解决方案,但我认为这很长:

String replace = pw.replace('&', '^');
        String[] rrex = replace.split("\\^+");
        for(String s:rrex)
        {
         if(s.matches("[0-9]{8}"))
         {
             System.out.println(s);
         }
        }

这段代码不是我想要的,我可以用正则表达式获取日期吗? 与String[] dates = pw.split(regex);

一样

2 个答案:

答案 0 :(得分:8)

您可以使用以下习语,迭代匹配:

String test = "6-006.a9&&20130323^000~1-206&&20130329^000~1-208.2&&20130322^000";
//                           ┌ look behind for "&&"
//                           |      ┌ group 1: year
//                           |      |       ┌ group 2: month
//                           |      |       |       ┌ group 3: day
//                           |      |       |       |       ┌ look ahead 
//                           |      |       |       |       | for escaped "^"
Pattern p = Pattern.compile("(?<=&&)(\\d{4})(\\d{2})(\\d{2})(?=\\^)");
// initialize matcher
Matcher m = p.matcher(test);
// iterate matches
while (m.find()) {
    // print matches formatted for each group
    System.out.printf(
        "Found: year %s / month %s / day %s%n", 
        m.group(1), 
        m.group(2), 
        m.group(3)
    );
}

<强>输出

Found: year 2013 / month 03 / day 23
Found: year 2013 / month 03 / day 29
Found: year 2013 / month 03 / day 22

注意

  • 对于给定月份,没有对月份值(例如> 1200)或日期(例如> 3100或无效日期索引进行验证)。
  • 我建议您在检索到值后在Pattern之外验证,以避免混乱。
  • 这仅适用于8位数的日期表示。调整Pattern以接受可选的1位数日/月或2位数年份可能会使其混乱。

答案 1 :(得分:0)

通过string.split功能。

String s = "6-006.a9&&20130323^000~1-206&&20130329^000~1-208.2&&20130322^000";
String parts[] = s.split("(?:^|\\^)[^&]*(?:&&|$)");
for(String i: parts)
{
    if (!i.isEmpty())
    {
    String out[] = i.split("(?=.{4}$)|(?=.{2}$)");  
    System.out.println("Year : " + out[0] + " month : " + out[1] + " day: " + out[2]);
}
}

<强>输出:

Year : 2013 month : 03 day: 23
Year : 2013 month : 03 day: 29
Year : 2013 month : 03 day: 22