Найти и заменить значение в скобках

157
20 ноября 2017, 17:24

Есть строка вида:

String text = "(слива) какие-то другие слова [яблоко], еще слова {груша}.";

Нужно найти и заменить слова в скобках, не заменяя при этом сами скобки.

Если я пишу:

text = text.replaceAll("(\\(|\\[|\\{).*?(\\)|\\]|\\})", "фрукт");

то на выходе получаю:

фрукт какие-то другие слова фрукт, еще слова фрукт.

то есть скобки уходят вместе с фруктом, а нужно, чтобы они остались.

Answer 1

По совету пользователя visman почитал описание метода appendReplacement класса Matcher. Туда можно провалиться, поставив breakPoint в методе replaceAll класса String.

The replacement string may contain references to subsequences captured during the previous match: Each occurrence of ${name} or $g will be replaced by the result of evaluating the corresponding {#group(String)} or {#group(int)} respectively.

Таким образом, если написать

text = text.replaceAll("(\\(|\\[|\\{).*?(\\)|\\]|\\})", "$1фрукт$2");

первое вхождение группы $1 будет то, что получено в результате выражения слева

(\\(|\\[|\\{)

второе вхождение группы $2 будет то, что получено в результате выражения справа

(\\)|\\]|\\})

(то, что в круглых скобочках, грубо говоря)

Важно: номер присваивается каждой группе, включая вложенные. Но в моем случае их всего две.

В итоге получается

"(фрукт) какие-то другие слова [фрукт], еще слова {фрукт}."
READ ALSO
Удаление нулей в Java

Удаление нулей в Java

вывожу в таблицу на странице jsp переменную <td><c:out value="${vp44150sqlkol}" /></td>, нужно удалить не значащие нули, есть число например такое 1

218
Присвоение двух значений одному textbox

Присвоение двух значений одному textbox

Подскажите как значения из двух текст боксов присвоить одному и добавить между ними запятую?

241
Separated аутентификация

Separated аутентификация

Доброго времени сутокЕсть три типа пользователей:

153