Есть строка вида:
String text = "(слива) какие-то другие слова [яблоко], еще слова {груша}.";
Нужно найти и заменить слова в скобках, не заменяя при этом сами скобки.
Если я пишу:
text = text.replaceAll("(\\(|\\[|\\{).*?(\\)|\\]|\\})", "фрукт");
то на выходе получаю:
фрукт какие-то другие слова фрукт, еще слова фрукт.
то есть скобки уходят вместе с фруктом, а нужно, чтобы они остались.
По совету пользователя 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
будет то, что получено в результате выражения справа
(\\)|\\]|\\})
(то, что в круглых скобочках, грубо говоря)
Важно: номер присваивается каждой группе, включая вложенные. Но в моем случае их всего две.
В итоге получается
"(фрукт) какие-то другие слова [фрукт], еще слова {фрукт}."
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
вывожу в таблицу на странице jsp переменную <td><c:out value="${vp44150sqlkol}" /></td>, нужно удалить не значащие нули, есть число например такое 1
Подскажите как значения из двух текст боксов присвоить одному и добавить между ними запятую?
Заменить checked всех checkBox'ов в ListView на unchacked