Заменить всю строку на Regex в строке замены?

Вот текст

<some string here could contain W or L letter><W1>123<W2>123<W3>123. 

надеюсь заменить

<W(number)> 

образец для

<L(number)>

шаблон.

String str = "<WLWLWL><W1><FS>123<W2><FS>345<E>";
    System.out.println(str);

    Pattern p = Pattern.compile("<[A-Z]\\d>");
    Matcher m = p.matcher(str);

    while(m.find()){
        System.out.println(m.group());
    }

    str.replaceAll("<[A-Z]\\d>", "<L\\d>");
    System.out.println(str);

Я могу найти именно то, что хочу, с кодом выше, но замена не работает.

Я полагаю, что строка замены не содержит в себе регулярное выражение. Итак, как лучше всего это сделать?


person apolloneo    schedule 03.09.2019    source источник
comment
Что не работает с вашей заменой? Выдает ошибку? (Если да, пожалуйста, отредактируйте вопрос и добавьте трассировку стека.) Это приводит к неожиданному результату? (Если да, отредактируйте вопрос и добавьте ожидаемый и фактический результат). Это что-то другое? отредактируйте вопрос и не заставляйте меня догадываться, что не так.   -  person Johannes Kuhn    schedule 04.09.2019


Ответы (2)


Другой альтернативой, которую вы можете попробовать, является использование регулярного выражения.

str = str.replaceAll("[a-zA-Z](?=\\d)", "L");

Объяснение регулярного выражения:

[a-zA-Z](?=\\d)    finds the letter within (a-zA-Z) which has a number after it

Вывод:

<WLWLWL><L1><FS>123<L2><FS>345<E>

Источник: Regex lookahead, lookbehind и атомарные группы

Подробнее о шаблоне RegEx: Шаблон класса

заменитьВсе():

Также replaceAll() изменяет строку, которую вы передаете в качестве параметра, но вместо этого функция возвращает новую, поскольку строки неизменяемы. Из Строка Java:

public String replaceAll(String regex, String replacement)
Returns:
   The resulting String
person Goion    schedule 03.09.2019

Я думаю, вы ищете группу захвата:

str = str.replaceAll("<[A-Z](\\d)>", "<L$1>");

Обратите внимание на задание в начале. replaceAll() не изменяет строку (строки неизменяемы); он возвращает новый.

person shmosel    schedule 03.09.2019
comment
Используйте group() или group(0), чтобы получить полное совпадение. - person shmosel; 04.09.2019