2015-05-26 3 views
5

Я хочу заменить все вхождения группы в строку.Заменить все вхождения группы

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

В результате я пытаюсь получить это ###,##.##0.000000000 В принципе, я хочу, чтобы заменить все # символы, волоча .0. Я нашел this about dynamic replacement, но я не могу заставить его работать.

Оптимальное решение не принимает во внимание количество хешей, подлежащих замене (если это устраняет путаницу).

+1

Итак, вы хотите заменить все '#' 'следующий .0' в '0'? – npinti

+0

@npinti. Да, извините за путаницу, я добавил объяснение. – alkis

+0

Сколько хэш-символов, заменяемых '0', может быть во входной строке? Неограниченно, скажем, сто? –

ответ

5

Вы можете использовать простое регулярное выражение для реализации этой задачи.

#(?=#*+$) 

(?=#*+$) = Положительный look-ahead, который проверяет для любого #, что предшествует 0 или более # символов до конца строки $. Редактировать: Я использую possessive quantifier*+, чтобы избежать каких-либо проблем с производительностью.

См demo

IDEONE:

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

Отличное решение и спасибо за объяснение. Конечно, выслушано – alkis

+1

Рад помочь. Я также думаю, что вы можете еще больше оптимизировать это, используя собственный квантификатор: '# (? = # * + $)'. Я отредактировал ответ. –

+0

Производительность здесь не проблема, так как мы говорим о небольших строках, но все же, прекрасно знать разницу. Можно ли поэтапно объяснить операцию регулярного выражения? Хотя ответы решают мою проблему, было бы здорово, если бы материал существовал (научить кого-то ловить рыбу ...) – alkis

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

Вы можете попробовать this.Replace по 0 .Увидь демо.

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

+0

Если я правильно понимаю, он выглядит следующим образом: Замените все '#', но отбросьте все, что предшествует '.0'. Не могли бы вы объяснить '?!'? – alkis

+0

@alkis '?!' - отрицательный lookahead.It заменит каждый '#', который не имеет '.0' перед этим. – vks

2

Вы можете разделить текст на «0,0» и заменить только для второй части:

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

Я предпочитаю регулярное выражение. Извините, если я не был достаточно ясен. Это справедливо, хотя и так рекомендуется. – alkis

Смежные вопросы