2012-10-09 26 views
5

Sorunum için uygun bir düzenli ifade oluşturmaya çalışıyorum ve görünüşe göre garip bir soruna yol açtım. Java Regex lookahead çok zaman alır

bana yapmaya çalışıyorum neyi tarif edeyim ..

Amacım dize her iki ucundan da virgül kaldırmaktır. E, g, string , ,, ,,, , , Hello, my lovely, world, ,, , sadece Hello, my lovely, world olmalıdır.

Bunu başarmak için regex aşağıdaki hazırladık: Bir bulmak için (\w+,*? *?)+(?=(,?\W+$))

Bu regex doğrulayıcıları içinde bir cazibe gibi çalışır, ancak Android cihazda çalıştırmak çalışıyorum zaman, matcher.find() fonksiyon için asılı ~ 1dk uygun maç ... sanıyorum, sorun kullanıyorum olumlu lookahead içindedir, ama sadece başından ve sonunda ayrı ayrı virgül Döşeme daha ben daha iyi bir çözüm bulamadık:

output = input.replaceAll("^(,?\\W?)+", ""); //replace commas at the beginning 
output = output.replaceAll("(,?\\W?)+$", ""); //replace commas at the end 

mi Orada olumlu bir şekilde kaybolduğum bir şey var n Java regex? Başlangıçta ve sonunda virgüller arasındaki dize bölümünü nasıl alabilirim?

cevap

8

Eşleşen gruplar kullanıyorsanız bir göz atmak zorunda değilsiniz. regex ^[\s,]*(.+?)[\s,]*$ deneyin:

DÜZENLEME: o ayrı, ^matches() kullanarak fakat başka yerde yararlı olabilir eğer teknik olarak gereksiz çizgi, başıyla eşleşir kırmak için. [\s,]*, sıfır veya daha fazla boşluk karakteriyle veya virgülle eşleşir, ancak açgözlülükle mümkün olduğunca çok sayıda karakteri kabul eder. (.+?), herhangi bir karakter dizisiyle eşleşir, ancak sondaki soru işareti, onu mümkün olduğunca az karakterle eşleşmesini (açgözlü olmayan) ve ayrıca içeriği ilk grup parantezi oluştururken "grup 1" e yakalamasını ister. Açgözlü olmayan eşleşme, son grubun aynı sıfır veya daha fazla virgül veya boşlukları ([\s,]*) içermesine izin verir. ^ gibi, son $, satırın sonuyla eşleşir - find() için yararlıdır ancak matches() için gereksizdir.

Yalnızca boşluklarla eşleşmesi gerekiyorsa, [\s,]'u [ ,] ile değiştirin.

Bu çalışması gerekir:!

Pattern pattern = Pattern.compile("^[\\s,]*(.+?)[\\s,]*$"); 
Matcher matcher = pattern.matcher(", ,, ,,, , , Hello, my lovely, world, ,, ,"); 
if (!matcher.matches()) 
    return null; 
return matcher.group(1); // "Hello, my lovely, world" 
+0

arghh ... Ben eşleşen grupları özledim nasıl .. :(Çok teşekkürler benim regex bilgisini tazelemek lazım ... –