2012-06-11 12 views
28

Ben dize bölmek gerekirRegex ile -, ::, (ve)

(yaş-is-25 :: YA :: last_name-is-qa6) :: VE: :(yaş bir-20 :: Veya :: first_name-ihtiva-testi)

dizeye [0] = (yaş-is-25 :: Veya :: last_name-is-qa6)

dize [1] = VE

dize [2] = (yaş-20 :: YA :: first_name-içeriyor-testi) O kadar çok regex ifadeler yazmaya çalıştı

ama beklendiği gibi bir şey çalışır.

Aşağıdaki normal ifadeyi kullanarak, Matcher.groupCount() 2 döndürür, ancak sonuçları bir arrayliste atama, öğeleri olarak null değerini döndürür.

Pattern pattern = Pattern.compile ("(\\): :)? | (:: \\()?");

I) kullanarak bölmek çalıştı :: ya. :(

ben regex çok aptal göründüğünü biliyorum, ama bu yazabilirim en iyisi bir acemi olmak

+3

Genelleme mümkün değildir Normal ifadeyle ayrıştırma ifadeleri, eşdeğerdir çalışır. – dasblinkenlight

+8

Eğer gerçekten bir şey denediyseniz aptal değil :) Sormadan önce bir şey denemek için harika bir iş. – Ewald

+0

''' sadece '' 'ile' 'bu splitter'e' 'koymadan nasıl bölebilir? – dantuch

cevap

36

İlk ve son parantezleri eşleştirmek için pozitif lookahead ve lookbehind'i kullanabilirsiniz.

String str = "(age-is-25::OR::last_name-is-qa6)::AND::(age-is-20::OR::first_name-contains-test)"; 

for (String s : str.split("(?<=\\))::|::(?=\\()")) 
    System.out.println(s); 

Çıkışlar:

(age-is-25::OR::last_name-is-qa6) 
AND 
(age-is-20::OR::first_name-contains-test) 

Sadece bir not Ancak: Eğer özyinelemeli dilinin çeşit ayrıştırdığınızdan gibi görünüyor. Düzenli ifadeler bunu yaparken iyi değildir. Gelişmiş ayrıştırma yapıyorsanız, diğer ayrıştırma yöntemlerine bakmanızı öneririm. regex bunun için yeterince güçlü değildir: Bunun günümüze

+8

Komik ayrıştırma önce?. açıkça gelişmiş regex daha aşina olduğu ve hâlâ gerisi gibidir "bu deneyin ve eğer şanslıysanız bu ödeme şekli". test eder. – MarioDS

+1

@dacwe gerçekten akıllı cevap arkadaşı biri. buna 1. –

+0

@dacwe: Çok teşekkür ederim Btw, yapıyorum nt kullanımının? <= ve? = ifadesini kullanır. Bunları öğreticilerin hiçbirinde görmedim. Açıklayabiliyor musun, yoksa bazı bilgileri nereden alabileceğime işaret edebilir misin? Tekrar teşekkürler. – aradhak

-1
textString.split("\\)::|::\\(") 
.

çalışmalıdır. Bu senin için

+0

Ters eğik çizgi iki defa geliyor ... biçimlendirme Kodunuzdaki karıştırıyor Eğer biçimlendirme benim ikinci ters eğik çizgi – ManojGumber

+3

kaldırıyor neden do not bir kod bloğu yapmak biliyorum, yoksa ilk dizede) olanlar 'this' – dantuch

+0

gibi içermeyecektir' '' kullanmak ve dize çok karmaşık göründü beri ( –

-1

çalışmalıdır.

\)::|::\(
1

Bana göre, stresinizin büyük bir kısmı, arama teriminizdeki özel karakterlerden kaçma ihtiyacından kaynaklanıyor. Özel karakterlerden manuel olarak kaçma işlemini yapmamanızı öneririz; bunun yerine, çıkış için Pattern.quote(...)'u kullanmanız önerilir.

1

bu sorunun

"(?<=\\))::|::(?=\\()"