2011-11-10 17 views
6

Bu Java regex sorununu nasıl çözebilirim?Regex: Bunu nasıl ele geçirebilirim? (tekrarlanan bir grubun içindeki yuvalanmış bir grup)

Girdi:

some heading text... ["fds afsa","fwr23423","42df f","1a_4([email protected]#","3240acg!g"] some trailing text....

Sorun: çift tırnak arasındaki her şeyi yakalamak istiyoruz. (Örnek: vs. fds AFSA, fwr23423)

Aşağıdaki desen çalıştık:

\[(?:"([^"]+)",?)+\]

Ancak Matcher.find() gerçekleştirirken kullanıldığında, bu StackOverflowError sonuçlanacaktır daha büyük bir giriş (ama küçük bir giriş için çalışıyor, bu Java'da bir hata). Ve eğer işe yaradıysa bile, o zaman matcher.group (1) sadece "3240acg! G" verecektir.

Bu sorunu nasıl çözebiliriz? (Ya birinci desen parantez şeritler gerekli olan çok sayıda desen kullanımı,?)

cevap

1

al dizisi [ ] arasında ve virgül ile ayrıldı. Bu çok daha kolay.

1

Üç önerileri: dizeleri sadece parantez oluşabilir Eğer

, o zaman onları hiç denetlemek ve sadece regex olarak "[^"]*" kullanabilir ve (hiçbir tırnak kaçan varsayarak) tüm eşleşmeleri bulmak gerekmez.

bunları yakalamak istemiyorum nerede dizeleri, çok başka yerlerde meydana gelebilir çünkü, çalışmazsa

iki adımda bunu.

  1. Maç \[[^\]]*\].
  2. ilk maçın sonucuna içinde "[^"]*" tüm oluşumlarını bulun. Veya bu dizeyi okumak için bir JSON ayrıştırıcısı kullanın. Biraz hile

Üçüncü ihtimal: "[^"\[\]]*"(?=[^\[\]]*\]) için

arayın. Bu, yalnızca bir sonraki parantezin bir kapatma dirseği olması durumunda bir dizgiyle eşleşecektir. Sınırlama: Dizelerin içine parantez verilmez.

List<String> matchList = new ArrayList<String>(); 
Pattern regex = Pattern.compile("\"[^\"\\[\\]]*\"(?=[^\\[\\]]*\\])"); 
Matcher regexMatcher = regex.matcher(subjectString); 
while (regexMatcher.find()) { 
    matchList.add(regexMatcher.group()); 
} 

bunu yaptığını söyleyebilir birkaç ay içinde bu bakar kimseyi sizce: Ben bunu Java gibi görünecektir nasıl bakmak, özellikle bu çirkin düşünün?

+0

Yani birden modelleri/maçlar gereklidir. Burada benzer bir şey buldum: http://answers.oreilly.com/topic/222-how-to-find-a-match-within-another-match-in-a-regular-expression/ – Devabc

+0

Eh, tamam orada başka bir yoldur, ama bence iyi değil. Cevabımı ekledim. –

İlgili konular