我有一个时间戳:200212312359
如何将其拆分为2012.12.31.23.59
简单的方法是.split("(?<=\\G.{2})")
,然后组合数组的前 2 个元素,但我想知道是否有任何更专业的解决方案。
您可以通过一个replaceAll
调用和一个有点过于复杂的正则表达式来获得相同的结果。
"200212312359".replaceAll("(^\\d{4}|\\d{2})(?!$)", "$1.")
分解后,它在 start 处匹配 4 位数字^\\d{4}
,或\\d{2}
在其他任何地方匹配 2 位数字,在输入末尾带有负前瞻(?!$)
以避免匹配最后一对。然后它用连接到数字的点替换 4 或 2 位数字。
您的解决方案不一定不专业;它只是不直观。如果您通过简单解释它拆分的日期格式来评论它,那么这与任何其他解决方案一样专业,恕我直言。
此外,如果您知道每个值的位置(点分隔),您可以使用 substring 方法:
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
正如科琳在评论中指出的那样,您可以使用组来创建新的格式化日期。这是示例
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
您还可以使用命名组来命名每个组并使用它们而不是它们的编号:
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})"