2017-03-01 16 views
2

テキストと特定の文字列を別の文字列と一致するまで取得したい。私は 持っている "ドア数:5かくかくしかじかこのドアの後ろに ...2つの特定の文字列の間でテキストを取得する方法

ドア数:このドアの後ろに6 かくかくしかじか" 私はドア数」を取得する必要があります。このドアのblaのblaの後ろ5 BLA ...」

String str = " Door 51 text1 Door 61 text2 Door 10 text3"; 
     Pattern pattern = Pattern.compile("\\s\\bPage\\b\\s\\d+(.*?)\\s\\bPage\\b\\s\\d+"); 
     Matcher matcher = pattern.matcher(str); 
     while (matcher.find()) { 
      System.out.println(matcher.group(1)); 
     } 

は、これは私のコードですが、私はit.Iがドア51テキスト1、テキスト2ドア61、ドア10テキスト3を必要とする実行するとき、私は唯一のテキスト1を取得します。あなたは試合が重なって判明として(.*?)後の代わりに消費するパターンの先読みを使用する必要が

+1

理由だけではなく、 'Door'は、その後、最初のスペースの後に結果の文字列を分割した場合に文字列を分割しませんか?最初の部分をintに変換します。このようにすると、 '[[61、" text2 "]、[10、" text3 "]]'のようなものになります。正規表現の必要はありません。 – domsson

答えて

3

\bDoor\s+\d+(.*?)(?=\bDoor\s+\d+|$) 
       ^^^^^^^^^^^^^^^^^^ 

regex demoを参照してください。改行文字以外の任意の0+文字(.*?)後

(?=\bDoor\s+\d+|$)先読みは、(単語全体として)列$又はDoorの終了を必要とする、1+空白(\s+)と1+桁(\d+)。 \sは単語charと一致しないので、r\b\sの単語境界は意味をなさないので、パターンを少し調整しました。

Java demosplit

String str = " Door 51 text1 Door 61 text2 Door 10 text3"; 
Pattern pattern = Pattern.compile("\\bDoor\\s+\\d+(.*?)(?=\\bDoor\\s+\\d+|$)"); 
Matcher matcher = pattern.matcher(str); 
while (matcher.find()) { 
    System.out.println(matcher.group(1)); 
} 

alternative solution

String str = "Door 51 text1 Door 61 text2 Door 10 text3"; 
String[] doors = str.replaceFirst("^\\s*\\bDoor\\s+\\d+\\s*", "").split("\\s*\\bDoor\\s+\\d+\\s*"); 
System.out.println(Arrays.toString(doors)); 
// = > [text1, text2, text3] 
+1

ありがとうございます。最初の解決策が働いた、私はグループ(1)の代わりにグループ()を使用した。 – user771

+0

だから、あなたは 'Doors ... 'を保つ必要がありますか?次に、第2のアプローチを先読みで使用することができます。 'String [] doors = str.split("(?= \\ bDoor \\ s + \\ d +) ")。 [** this IDEONE demo **](https://ideone.com/R0Npvk)を参照してください。 –

関連する問題