2011-03-03 18 views
7

Düzenli ifadeler kullanarak ayrıştırmam gereken bir metin dosyası var. Ben yakalamak için gereken metin böyle satırlı gruplarda: Ben bu "blok" halinde, sonraki yedi lines.In başka deyişle ardından kamyon yakalamanız gerekir Bu örnek içinJava'da düzenli ifadeler kullanarak çok satırlı bir deseni nasıl yakalarım?

truck 
zDoug 
Doug's house 
(123) 456-7890 
[email protected] 
30 
61234.56 
8/10/2003 

vehicle 
eRob 
Rob's house 
(987) 654-3210 
[email protected] 

Ben 8 grupları var. Bu ne denedim ama bir sonraki çizgiyi yakalamak olmaz:

(truck)\n(\w). 

NOT: Java için ben portuna bunu önce benim regex test etmek programı RegExr kullanıyorum.

+2

çalışması gerekir? –

+0

@nikita Yeni satırlar içeren gruplar oluşturmak istiyorum çünkü – lampShade

cevap

5
(?m)^truck(?:(?:\r\n|[\r\n]).+$)* 

Bütün bu metni kabul gibi dotall modunda şey derlenmiş gerektiğini düşünüyoruz yani sen 'bir dosya satır-hattı okumayan'), ancak , kod satırınızın her zaman \n olduğunu varsayıyor. En azından \r\n ve \r için de (?:\r\n|[\r\n])'un yaptığı gibi izin vermelisiniz. Ama yine de sadece bir ayırıcı ile eşleşiyor, bu yüzden maç blokun sonunda çift hat ayırıcıdan önce durur.

Bir veri bloğuyla eşleştirdiğinizde, tek tek satırları almak için onu satır ayırıcılarına ayırabilirsiniz. İşte bir örnek:

Pattern p0 = Pattern.compile("(?m)^truck(?:(?:\r\n|[\r\n]).+$)*"); 
Matcher m = p0.matcher(data); 
while (m.find()) 
{ 
    String fullMatch = m.group(); 
    int n = 0; 
    for (String s : fullMatch.split("\r\n|[\r\n]")) 
    { 
    System.out.printf("line %d: %s%n", n++, s); 
    } 
} 

çıkışı: Ben de her veri satırı farz ediyorum

line 0: truck 
line 1: zDoug 
line 2: Doug's house 
line 3: (123) 456-7890 
line 4: [email protected] 
line 5: 30 
line 6: 61234.56 
line 7: 8/10/2003

en az bir karakter içerir ve veri bloğu arasındaki boş satırlar gerçekten boş olduğunu - yani boşluksuz , SEKMELER veya diğer görünmez karakterler.

(BTW:. (?m) kaldırmak ve bunun yerine RegExr ActionScript tarafından desteklenmektedir multiline kutuyu, yani kurallar biraz farklı, RegExr o regex test etmek bir Java Destekli regex test için göz atın. RegexPlanet.) Eğer çizgi ile giriş hattını okumak gerekiyorsa

+0

Harika cevap Teşekkürler Alan! – lampShade

+0

Ne harika bir cevap. Gerçekten onu takdir ederim. Regex çok güçlü – lampShade

3

ben birden fazla satıra için lütfen Desen (tek bir dize halinde okundu

Pattern p = Pattern.compile("truck\\n(.*\\n){7}", Pattern.DOTALL); 
+0

Bu regex, * DOTALL bayrağı olmadan * düzeltmek için çok daha yakın olurdu. Olduğu gibi, '. *' Başlangıçta belgenin geri kalanını tüketecektir. Sonra biraz geri dönebilir, ancak yine de her şey son satır beslemesine kadar eşleşecektir. –

+0

Ah, açgözlülük! :-) bir "?" En sonunda ... Bunu işaret ettiğin için çok teşekkürler! – mazaneicha

+0

Niceleyiciyi açgözlü yapmaya gerek yok. Sadece 'DOTALL' bayrağından kurtulun ve nokta artık yeni satırlarla eşleşmeyecek. –

3

bu desen o regex ile ne ilgisi var, ((.*|\n)*)

+0

Bu işe yarıyor! Teşekkür ederim! –