2012-03-30 9 views
3

私はJavaで特定のテキストを持っており、パターンとマッチャーを使ってその中から何かを抽出したいと考えています。これは私のプログラムです:Javaのパターン/マッチャ?

public String getItemsByType(String text, String start, String end) { 

    String patternHolder; 
    StringBuffer itemLines = new StringBuffer(); 

    patternHolder = start + ".*" + end; 

    Pattern pattern = Pattern.compile(patternHolder); 
    Matcher matcher = pattern.matcher(text); 

    while (matcher.find()) { 
     itemLines.append(text.substring(matcher.start(), matcher.end()) 
       + "\n"); 
    } 

    return itemLines.toString(); 
} 

検索テキストは、例えば、同じライン上にあるときに、このコードは完全に動作します:

String text = "My name is John and I am 18 years Old"; 

getItemsByType(text, "My", "John"); 

はすぐにテキストのうち、テキスト「私の名前はジョンである」をつかみます。しかし、私のテキストは次のようになりますとき:

String text = "My name\nis John\nand I'm\n18 years\nold"; 

getItemsByType(text, "My", "John"); 

それは「私」と「ジョン」は、異なるライン上にあることから、何かをつかむしません。これをどうすれば解決できますか?

+0

あなたは 'itemLines.append(text.substring(matcher.start()、matcher.end()) + "\ n" を)変更する必要があります;' itemLines.append(matcher.group())に ' ; itemLines.append( '\ n'); ' 文字列バッファを手元に持っているときに+を使用して文字列連結を行うべきではありません。また、私はStringBufferの代わりにStringBuilderを使用します。 –

答えて

7

用途:

Pattern.compile(patternHolder, Pattern.DOTALL); 

javadocからは、DOTALLフラグは意味:

はDOTALLモードを有効にします。

ドットモードでは、式。行終端文字を含む任意の文字にマッチします。デフォルトでは、この式は行ターミネータと一致しません。

+0

お世話になりました。 – ZimZim

1

Pattern.compile(patternHolder, Pattern.DOTALL)を使用してパターンをコンパイルします。こうすることで、ドットは改行にマッチします。デフォルトでは、改行は特殊な方法で扱われ、ドットではマッチしません。代わりに、この

関連する問題