2016-04-02 7 views
1

以下の文字列から各ブロックFooを取得する必要があります。私はこれに正規表現を使用します。コードを以下に示します。しかし、正規表現の部分($|( ..F))のために私はFoo[1]Foo[3]しか得られません。正規表現でブロックFooを取得するにはどうすればよいですか?Groovyの正規表現が含まれていない

import java.util.regex.Matcher 

String test = ''' ..Foo[1]dsfsdf 
    ...........sfsdfdsfsdfsdf 
    ..............sdfffffffffsd 
    ..................sdffffffffffffffff 
    ..Foo[2]dsfsdf 
    ...........sfsdfdsfsdfsdf 
    ..............sdfffffffffsd 
    ..................sdffffffffffffffff 
    ..Foo[3]dsfsdf 
    ...........sfsdfdsfsdfsdf 
    ..............sdfffffffffsd 
    ..................sdffffffffffffffff 
    ..Foo[4]dsfsdf 
    ...........sfsdfdsfsdfsdf 
    ..............sdfffffffffsd 
    ..................sdffffffffffffffff''' 

Matcher m = test =~ /(Foo\[[0-9]{1,6}\][\s\S]*?)($|( ..F))/ 
m.find(); 
//after this m.count equals 2 and contains only Foo[1] and Foo[3], but I need 4 with all Foo's 
+0

これは私には分かりません –

+0

@YassinHajajなぜですか? Groovyの構文ですか? Java同等物:パターンp = Pattern.compile( "(Foo \ [[0-9] {1,6} \] [\ s \ S] *?)($ |(..F))");マッチャーm = p.matcher(テスト); m.find() –

+0

私はそれが面白かったことに気付かなかった。ごめんなさい。 –

答えて

0
あなただけの開口部 (?=を追加することにより、 ($|( ..F)) positive lookaheadにそれを回すことによって、非浪費を作る(そして、彼らは文字通りのドットを一致させることができるようにドットをエスケープ)する必要があり

(Foo\[[0-9]{1,6}\][\s\S]*?)(?=$| \.\.F) 
          ^^^^^^^^^^^^^ 

regex demo

+0

[IDEONE demo](http://ideone.com/4K6lvN)の 'm.count'の結果を' 4'として出力してください –

+0

ありがとうございました –

+0

遅延マッチングは、非常に長いチャンクにマッチする最良の方法ではありません。このパターンを[Foo \ [[0-9] {1,6} \] [^] *(?:(?!\。\。F)[^] *)*) ' ](https://regex101.com/r/sF0kY4/2)。緑色のボックスで必要なステップの数を比較します。 222対1787です。 '[^]'は '\ S'に置き換えられ、スペースは' \ s'で置き換えられます。 –

関連する問題