2015-05-26 27 views
5

Bir grubun tüm yinelemelerini bir dizede değiştirmek istiyorum.Grubun tüm oluşumlarını değiştir

String test = "###,##.##0.0########"; 
System.out.println(test); 
test = test.replaceAll("\\.0(#)", "0"); 
System.out.println(test); 

ben elde çalışıyorum sonuç Temelde, .0 sondaki tüm # sembolleri değiştirmek istiyor ###,##.##0.000000000 olduğunu. this about dynamic replacement buldum ama gerçekten çalışamam.

En uygun çözüm, değiştirilecek olan karmaların sayısını dikkate almaz (eğer herhangi bir karışıklık varsa).

+1

Yani '0' için .0'' aşağıdaki tüm '#' değiştirmek istiyor? – npinti

+0

@npinti. Evet, karışıklık için özür dilerim, açıklama ekledim. – alkis

+0

0 karakteriyle değiştirmek için kaç tane karma sembol bir giriş dizesinde olabilir? Sınırsız mı, yoksa yüz mü? –

cevap

5

Sen görevi başarmak için basit normal ifadeler kullanabilirsiniz.

#(?=#*+$) 

(?=#*+$) dize $ sonundan önce 0 ya da daha fazla # sembollerle önce herhangi bir # kontrol eden bir pozitif look-ahead =. Edit: Herhangi bir performans sorununu önlemek için şimdi possessive quantifier*+ kullanıyorum.

demo

IDEONE bakınız:

String test = "###,##.##0.0###########################################"; 
test = test.replaceAll("#(?=#*+$)", "0"); 
System.out.println(test); 
+0

Harika bir çözüm ve açıklama için teşekkür ederim. Tabii ki, – alkis

+1

Yardım almak için memnun oldum. Ayrıca, sahiplenici niceleyici kullanarak daha da optimize edeceğinizi düşünüyorum: '# (? = # * + $)'. Cevabı ben düzenledim. –

+0

Performans, küçük dizelerden söz ettiğimizden beri burada bir sorun değil, ama yine de, farkı bilmek harika. Regex işlemini adım adım açıklamak mümkün mü? Cevaplar benim problemimi çözse de, materyal var olsaydı harika olurdu (birine balık tutmayı öğretirdi ...) – alkis

7
#(?!.*\\.0) 

Bunu deneyebilirsiniz.Replace by 0 .See demo.

https://regex101.com/r/yW3oJ9/12

+0

Eğer doğru anlıyorsam, şu şekilde gider: Her '# 'yi değiştirin ancak önceki .0'daki her şeyi atın. "?" Yi açıklar mısınız? – alkis

+0

@alkis '?! 'Negatif bir görünümdür. Her' # 'yerine gelecek. – vks

2

Sen "0.0" ile ilgili metni bölmek ve sadece ikinci bölümü için değiştirebilirsiniz:

String[] splited = "###,##.##0.0########".split("0.0"); 
String finalString = splited[0] + "0.0" + splited[1].replaceAll("#","0"); 
+0

Düzenli bir çözüm tercih ederim. Üzgünüm, yeterince açık olmasaydım. Bu geçerli, bu yüzden de geçerlidir. – alkis

İlgili konular