2011-07-26 17 views
9

Ben dizeleri aşağıda gibi vardır: iç @[email protected] dizeleri içerenNormal İfade - tüm yinelenen grupları yakalama

@[email protected] text [email protected]@another optional text here etc 

.

Tüm bu "değişkenleri" bir regexp eşleştirmesi yoluyla gruplar halinde yakalamak istiyorum, ancak regexp tekrar ederken sadece son yakalanan grup döndürdüğünden mümkün görünmüyor.

+0

Dikkatli olun, '@. + @' Yerine @ [^ @] + @ 'isteyebilirsiniz. @ – sidyll

+0

Doğru sürümü eklemeyi unuttum," @. +? @ –

cevap

17

Haklısınız; Çoğu regex aroması, Java dahil, tekrarlanan bir yakalama grubunun bireysel eşleşmelerine erişime izin vermez. (Perl 6 ve .NET bunu kayıt için yapar, ama bu size yardımcı olmaz).

Başka neler yapabilirsiniz? teker @[email protected], @[email protected] vs. birini yakalayacaktır

Pattern regex = Pattern.compile("@[^@][email protected]"); 
Matcher regexMatcher = regex.matcher(subjectString); 
while (regexMatcher.find()) { 
    // matched text: regexMatcher.group() 
    // match start: regexMatcher.start() 
    // match end: regexMatcher.end() 
} 

.

2

Ayırıcının @ olacağını biliyorsanız, neden sadece split yöntemini (string.split('@')) kullanın?

+0

Bu bir ayırıcı değil property/placeholder'ın "tag" özelliğini başlat/sonlandır –

+0

Peki, bu durumda, 'split' işlemini yapamaz, sonuçta oluşan diziyi çaprazlayamaz ve özellik isimlerini ve isteğe bağlı metni yakalayamazdınız? –

+0

Aşağıdaki örneklerden nasıl haberdar olabilirsiniz? hangisi bir özellik ve hangisi bir metin: "@ property @ text" ve "text @ property". Split size ["property", "text"] veya ["text", property "] verir. –