2016-04-02 28 views
1

Her dize Foo'nun aşağıdaki dizeden olmasını istiyorum. Bunun için düzenli bir ifade kullanıyorum. Kod aşağıda sunulmuştur. Ancak, reerx bölümünün ($|( ..F)) bölümünden dolayı sadece Foo[1] ve Foo[3] olsun. Regex ile her bir Foo bloğunu nasıl alabilirim?Groovy regex eşleşmesi olmadan dahil

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

Bu bana göre –

+0

@YassinHajaj neden? Groovy sözdizimi? Java karşılığı: Desen p = Model.compile ("(Foo \ [[0-9] {1,6} \] [\ s \ S] *?) ($ | (..F))"); Eşleştirici m = p.matcher (test); m.find() –

+0

Tamam Çok güzel olduğunu fark etmedim. afedersiniz. –

cevap

0
sadece açılış ( sonra ?= ekleyerek ($|( ..F)) bir positive lookahead dönüştürerek olmayan tüketen yapmak (ve değişmez noktalar maç diye noktalar kaçış) gerekir

:

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

Bkz regex demo

+0

[IDEONE demosu] 'ne bakın (http://ideone.com/4K6lvN) 'm.count' sonucu yazdır' 4' –

+0

Teşekkür ederim çok fazla –

+0

Bu tembel eşleşmenin çok uzun parçaların eşleştirilmesinin en iyi yolu olmadığını unutmayın. metin, bu deseni ['(Foo \ [[0-9] {1,6} \] [^] * (?: (?! \. \. F) [^] *) *)' olarak açabilirsiniz ] (https://regex101.com/r/sF0kY4/2). Yeşil kutuda gerekli adım sayısını karşılaştırın. 222 vs 1787. '[^]' 's' ile' \ S' ve bir boşluk ile değiştirilebilir. –