2017-08-12 22 views
2

この質問は以前に何度か尋ねられましたが、私の質問に答えが見つかりませんでした: 文字列を2つの文字列に分割する必要があります。最初の部分は日付で、2番目の文字列はテキストです。これは私がこれまでに得たものである:正規表現を使用して文字列を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を用いて第2のスペースで分割:

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を参照してください。 1日付をキャプチャし、他の残りの部分をキャプチャします:あなたはあなたの文字列が日時の値で始まるを確認するには

は、あなたは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 - 空白(これがオプションである場合には、追加* after)
  • (.*) - 文字列の最後まで0以上の文字をキャプチャするグループ2(.は、Pattern.DOTALLフラグのため改行も一致します)。
+1

これは実際に質問に答えるものではありません。「文字列を2つの文字列に分割する必要があります」* – Bohemian

+1

@ボヘミアンそれは**その質問に答えます**。 ** **特定のパターンで始まる文字列を** 2つの**部分に分割します。あなたが反対を証明できるなら、私は答えを取り除きます。 –

+1

"証明"はあなたのコードのどこにも 'split'がなく、' String [] '結果がありません。コードのどこかに 'String []'を作成してその要素に値を割り当てることができますが、その時点で 'String [] testResult = new String [2];というコードを書くこともできます。 testResult [0] = test.substring(0、14); testResult [1] = test.substring(15); 'これはあなたの答えよりはるかに少ないコードであり、より単純ですが、まだ文字列を分割しません。要求通りに入力を実際に分割するシンプルで洗練されたソリューションについては、私の答えを見てください。 – Bohemian

3

正規表現をスキップします。 3つの文字列を使用してください。

あなたはあまりにも頑張っています。日付と時刻を1つにまとめる必要はありません。正規表現はやりにくく、人生は短いです。

の3つのピースをプレーンとして使用して、日付時刻を再アセンブルしてください。

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を参照してください。以下のための標準ISO 8601形式を使用して、あなたがその入力の上に任意のコントロールを持っている場合は、スイッチへ:

ldt.toString():2017-12-24T18:17

説明:

ヒントたTestStringテキスト中の日時の値。 java.timeクラスは、文字列を生成/解析する際に標準で標準形式を使用します。

関連する問題