使用正则表达式将字符串拆分为两个字符串

时间:2017-08-12 17:37:04

标签: java regex string split

之前曾多次询问此问题,但我无法找到问题的答案: 我需要将一个字符串拆分为两个字符串。第一部分是日期,第二部分是文本。这是我到目前为止所得到的:

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;但我想念约会。有没有更好的(甚至更简单的)方式?非常感谢帮助!

3 个答案:

答案 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标志)。