2017-07-21 22 views
1

コードを書きましたが、正しく動作しません。ここで私のRegEx、私は入力として持っているものと私が出力として期待しているものを見つけることができます。私は束縛されていないグループを使用しています。なぜなら、私は "Bundle"という言葉を得るまでテキストを読んでいますが、それを捕捉したものには含めたくありません。しかし、私は誤って何をしたのか分かりません。ここでJavaの非キャプチャグループRegEx

Pattern pattern = Pattern.compile(
       "((Bundle\\s+Components)|(Included\\s+Components))\\s+(.*?)(?:Bundle)", Pattern.DOTALL); 

     Matcher matcher = pattern.matcher(tableInformation); 

     while (matcher.find()) { 

      String bundleComponents = matcher.group(); 
      System.out.println(bundleComponents); 
     } 

は例です: 例1:

Bundle Components bla blah\blabla?!()\\ANY CHARACTER IS POSSIBLE HERE, EVEN LINEBREAK,blah blah 
Bundle Type 

例2:私は例のために期待する

Included Components 
    blah blah, like above, 
    Bundle Type 

出力

は、ここに私のコードです。 1:

Bundle Components bla blah\blabla?!()\\ANY CHARACTER IS POSSIBLE HERE, EVEN LINEBREAK,blah blah 

出力2:

Included Components 
blah blah, like above, 

Exの出力として得られるものは次のとおりです。 2:

Bundle Components bla blah\blabla?!()\\ANY CHARACTER IS POSSIBLE HERE, EVEN LINEBREAK,blah blah 
    Bundle Type 

Exの出力として得られるもの。 2:

Included Components 
blah blah, like above, 
Bundle Type 
これで先読みグループ内のパターンがマッチに含まれていないので、あなたは、肯定先読みでこれを行うことができます

答えて

1

フルマッチでは、キャプチャしていないグループでさえ、正規表現が言いたいことはすべて得られます。適切なMatchを取得して、キャプチャしていないグループを取り除く必要があります。もう1つの解決策は、グループをキャプチャするのではなく正の先読みを使用することです。下の正規表現を確認してください。私はまた不要な(IMO)グループをいくつか削除しました。

(?:Bundle\s+Components|Included\s+Components)\s+.*?(?=Bundle) 

結果は1つの完全一致となります。

Demo

PS:「バンドル」は、この溶液中にも捕獲される直前に新しい行の看板。

1

:(テストしていない)

((?:Bundle\\s+Components)|(?:Included\\s+Components))\\s+(.*?)(?=Bundle)

関連する問題