2017-08-12 230 views
2

以前曾經問過幾次這個問題,但我找不到我的問題的答案: 我需要將字符串拆分爲兩個字符串。第一部分是日期,第二部分是文本。這是我到目前爲止:用正則表達式將字符串拆分爲兩個字符串

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 

我可以提取「TestString」,但我想念日期。有沒有更好的(或者更簡單)方法?非常感謝幫助!

+0

您的字符串是否始終是此格式的日期,後面是任意文本? – pchaigno

+0

如果你不打擾依靠日期和時間長度不變的事實,那麼有一種簡單的方法。 –

回答

2

你想匹配只有分隔符。通過匹配日期,你消耗它(它被扔掉了)。

使用看後面,它斷言,但不消耗:

test.split("(?<=^.{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

爲什麼downvote?這完全回答了這個問題,並且完美地運作 – Bohemian

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標誌)。
+1

這實際上並沒有回答問題,它詢問*「我需要將一個字符串分成兩個字符串」* – Bohemian

+1

@Bohemian它**確實**回答該問題。它**不會**將一個以特定模式開始的字符串分成**兩個**部分。如果你能證明相反,我會刪除答案。 –

+1

「證明」是代碼中沒有'split',並且沒有'String []'結果。你可以在你的代碼的某個地方創建一個String []併爲它的元素賦值,但是在那一點你可能也會使用代碼String [] testResult = new String [2]; testResult [0] = test.substring(0,14); testResult [1] = test.substring(15);'這是比你的答案少得多的代碼,並且更簡單,但是仍然不分割字符串。看到我的答案是一個簡單,優雅的解決方案,實際上按要求分割輸入。 – Bohemian

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

描述:的TestString

提示:如果有超過該輸入任何控制,切換到使用標準ISO 8601格式日期時間值在文本中。在生成/解析字符串時,java.time類默認使用標準格式。

相關問題