如何将Java中的字符串拆分为不同大小的部分?

时间:2013-04-24 17:54:57

标签: java regex split

我有一个时间戳:200212312359 如何将其拆分为2012.12.31.23.59

简单的方法是.split("(?<=\\G.{2})"),然后结合数组的前2个元素,但我想知道是否有更专业的解决方案。

4 个答案:

答案 0 :(得分:6)

您可以通过一次replaceAll调用和一些过于复杂的正则表达式获得相同的结果。

"200212312359".replaceAll("(^\\d{4}|\\d{2})(?!$)", "$1.")

细分,它在开始^\\d{4}处匹配4位数,或在其他任何位置匹配2位\\d{2},在输入(?!$)的末尾带有否定前瞻,以避免匹配最后一双。然后用一个连接到数字的点替换4或2位数字。

答案 1 :(得分:0)

对于您的解决方案,没有必要不专业;它只是不直观。如果你用一个简单的解释来评论它分割的日期格式,那么这就像专业的解决方案一样,恕我直言。

答案 2 :(得分:0)

此外,如果您知道每个值的位置(点分隔),您可以使用子字符串方法:

 String unformatted = String.valueOf(200212312359);
 String year = unformatted.substring(0,4); 
 String month = unformatted.substring(4,6);
 String day = unformatted.substring(6,8); 
 String hour = unformatted.substring(8,10);
 String minute = unformatted.substring(10,12);
 String formatted = String.format("%s.%s.%s.%s.%s", year, month, day, hour, minute);

请阅读http://docs.oracle.com/javase/7/docs/api/java/lang/String.html

答案 3 :(得分:0)

正如Colleen在评论中指出的那样,您可以使用组来创建新的格式化日期。这是示例

Pattern p = Pattern.compile("^(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})$");
Matcher m = p.matcher("200212312359");
StringBuilder sb = new StringBuilder();
if (m.find()) {
    sb.append(m.group(1));
    for (int i = 2; i <= m.groupCount(); i++)
        sb.append(".").append(m.group(i));
}
System.out.println(sb);

输出:2002.12.31.23.59

您还可以使用named-groups为每个组命名并使用它们而不是数字:

Pattern p2 = Pattern.compile("^(?<year>\\d{4})(?<month>\\d{2})" +
        "(?<day>\\d{2})(?<hour>\\d{2})(?<minute>\\d{2})$");
Matcher m2 = p2.matcher("200212312359");
if (m2.find()) {
    String formatedDate = m2.group("year") + "." + m2.group("month")
            + "." + m2.group("day") + "." + m2.group("hour") 
            + "." + m2.group("minute");
    System.out.println(formatedDate);
}

您还可以更新分割,以防止前两位数分割,如此

"200212312359".split("(?<=^\\d{4}|(?!^)\\G.{2})"