之前曾多次询问此问题,但我无法找到问题的答案: 我需要将一个字符串拆分为两个字符串。第一部分是日期,第二部分是文本。这是我到目前为止所得到的:
String test = "24.12.17 18:17 TestString";
String[] testSplit = test.split("\\d{2}.\\d{2}.\\d{2} \\d{2}:\\d{2}");
System.out.println(testSplit[0]); // "24.12.17 18:17" <-- Does not work
System.out.println(testSplit[1].trim()); // "TestString" <-- works
我可以提取&#34; TestString&#34;但我想念约会。有没有更好的(甚至更简单的)方式?非常感谢帮助!
答案 0 :(得分:3)
你工作太辛苦了。无需将日期和时间整合在一起。正则表达式很棘手,生命很短暂。
只需使用简单的String::split
代替三个,然后重新组合日期时间。
String[] pieces = "24.12.17 18:17 TestString".split( " " ) ; // Split into 3 strings.
LocalDate ld = LocalDate.parse( pieces[0] , DateTimeFormatter.ofPattern( "dd.MM.uu" ) ) ; // Parse the first string as a date value (`LocalDate`).
LocalTime lt = LocalTime.parse( pieces[1] , DateTimeFormatter.ofPattern( "HH:mm" ) ) ; // Parse the second string as a time-of-day value (`LocalTime`).
LocalDateTime ldt = LocalDateTime.of( ld , lt ) ; // Reassemble the date with the time (`LocalDateTime`).
String description = pieces[2] ; // Use the last remaining string.
请参阅此code run live at IdeOne.com。
ldt.toString():2017-12-24T18:17
description:TestString
提示:如果您对该输入有任何控制权,请切换为使用标准ISO 8601格式的文本中的日期时间值。生成/解析字符串时,java.time类默认使用标准格式。
答案 1 :(得分:2)
您希望仅匹配分隔符。通过匹配日期,您消费它(它被扔掉)。
使用后面的,它断言但不消耗:
test.split("(?<=^.{14}) ");
这个正则表达式意味着&#34;在输入开始后#14;前面有14个字符的空格上分开。
您的测试代码现在可以使用:
String test = "24.12.17 18:17 TestString";
String[] testSplit = test.split("(?<=^.{14}) ");
System.out.println(testSplit[0]); // "24.12.17 18:17" <-- works
System.out.println(testSplit[1].trim()); // "TestString" <-- works
答案 2 :(得分:2)
如果您的字符串始终采用此格式(格式正确),则甚至不需要使用正则表达式。只需使用.substring
和.indexOf
分隔第二个空格:
String test = "24.12.17 18:17 TestString";
int idx = test.indexOf(" ", test.indexOf(" ") + 1);
System.out.println(test.substring(0, idx));
System.out.println(test.substring(idx).trim());
请参阅Java demo。
如果要确保字符串以日期时间值开头,可以使用匹配方法将字符串与包含2个捕获组的模式匹配:一个将捕获日期,另一个捕获日期将捕获字符串的其余部分:
String test = "24.12.17 18:17 TestString";
String pat = "^(\\d{2}\\.\\d{2}\\.\\d{2} \\d{2}:\\d{2})\\s(.*)";
Matcher matcher = Pattern.compile(pat, Pattern.DOTALL).matcher(test);
if (matcher.find()) {
System.out.println(matcher.group(1));
System.out.println(matcher.group(2).trim());
}
请参阅Java demo。
<强>详情:
^
- 字符串开头(\\d{2}\\.\\d{2}\\.\\d{2} \\d{2}:\\d{2})
- 第1组:日期时间模式(xx.xx.xx xx:xx
- 类似模式)\\s
- 一个空格(如果是可选的,请在其后添加*
)(.*)
- 第2组捕获任意0个字符,直到字符串结尾(.
也会匹配换行符,因为Pattern.DOTALL
标志)。