2015-05-26 17 views
5

Chcę zastąpić wszystkie wystąpienia grupy w ciągu znaków.Zastąp wszystkie wystąpienia grupy

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

Wynik Próbuję uzyskać to ###,##.##0.000000000 Zasadniczo chcę zastąpić wszystkie # symbole, które są ciągnąc .0. Znalazłem this about dynamic replacement, ale nie mogę naprawdę sprawić, żeby działało.

Optymalne rozwiązanie nie bierze pod uwagę liczby skrótów do zastąpienia (jeśli to usunie jakiekolwiek zamieszanie).

+1

Więc chcesz wymienić cały '#' 'następujące .0' do' 0'? – npinti

+0

@ npinti. Tak, przepraszam za zamieszanie, dodałem wyjaśnienie. – alkis

+0

Ile symboli skrótu do zastąpienia przez '0' może być w ciągu wejściowym? Nieograniczona, powiedzmy sto? –

Odpowiedz

5

Można użyć prostego wyrażenia regularnego, aby osiągnąć swoje zadanie.

#(?=#*+$) 

(?=#*+$) = dodatnia look-ahead że sprawdza czy #, który jest poprzedzony przez 0 lub więcej # symboli do końca łańcucha $. Edycja: Używam teraz possessive quantifier*+, aby uniknąć problemów z wydajnością.

Zobacz demo

IDEONE:

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

Świetne rozwiązanie i dziękuję za wyjaśnienia. Oczywiście przegłosowano – alkis

+1

Cieszę się, że mogę Ci pomóc. Myślę też, że możesz jeszcze bardziej zoptymalizować to za pomocą kwantyfikatora dzierżawczego: '# (? = # * + $)'. Zmieniłem odpowiedź. –

+0

Wydajność nie jest tu problemem, ponieważ mówimy o małych ciągach, ale mimo wszystko dobrze jest wiedzieć, jaka jest różnica. Czy można wyjaśnić krok po kroku operację wyrażeń regularnych? Chociaż odpowiedzi rozwiązują mój problem, byłoby wspaniale, gdyby istniał materiał (naucz kogoś łowić ryby). – alkis

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

Możesz to wypróbować.Zachowaj przez 0. Zobacz wersję demo.

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

+0

Jeśli rozumiem poprawnie, to wygląda następująco: Zastąp wszystkie '# ', ale odrzuć wszystko, co poprzedza' .0'. Czy mógłbyś wyjaśnić "?!"? – alkis

+0

@alkis '?!' Jest negatywnie wcześniejsza.Zostań zastąpi każde '#', które nie ma '.0' przed nim. – vks

2

Można podzielić tekst na „0.0” i wymienić tylko do drugiej części:

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

Preferuję rozwiązanie regex. Przepraszam, jeśli nie byłem wystarczająco jasny. Jest to jednak poprawne, dlatego zostało wznowione. – alkis

Powiązane problemy