#java #регулярные_выражения
Есть строка вида: String text = "(слива) какие-то другие слова [яблоко], еще слова {груша}."; Нужно найти и заменить слова в скобках, не заменяя при этом сами скобки. Если я пишу: text = text.replaceAll("(\\(|\\[|\\{).*?(\\)|\\]|\\})", "фрукт"); то на выходе получаю: фрукт какие-то другие слова фрукт, еще слова фрукт. то есть скобки уходят вместе с фруктом, а нужно, чтобы они остались.
Ответы
Ответ 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 будет то, что получено в результате выражения справа (\\)|\\]|\\}) (то, что в круглых скобочках, грубо говоря) Важно: номер присваивается каждой группе, включая вложенные. Но в моем случае их всего две. В итоге получается "(фрукт) какие-то другие слова [фрукт], еще слова {фрукт}."
Комментариев нет:
Отправить комментарий