ReplaceAll, когда это не альфа-символы

Мне нужно заменить все вхождения слова в строку, когда оно находится между небуквенными символами (цифрами, пробелами и т. д.) или в начале или в конце строки на $0. Однако мой шаблон Regex, похоже, не работает, когда я использую replaceAll.

Я попробовал несколько решений, которые нашел в Интернете, например Pattern.quote, но шаблон не работает. Однако он отлично работает на https://regexr.com/.

public static final String REPLACE_PATTERN = "(?<=^|[^A-Za-z])(%s)(?=[^A-Za-z]|$)";

String patternToReplace = String.format(REPLACE_PATTERN, "a");

inputString = inputString.replaceAll(Pattern.quote(patternToReplace), "$0");

Например, со строкой и словом «а»:

a car4is a5car

Я ожидаю, что вывод будет:

$0 car4is $05car
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
122
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Pattern.quote() возвращает литерал регулярного выражения, а все промежуточное значение равно воспринимается как текст.

Вы должны использовать Matcher для замены всех вхождений строки. Кроме того, как указал @Донат, $0 обрабатывается как переменная регулярного выражения, поэтому вам нужно ее экранировать.

inputString = Pattern.compile(patternToReplace).matcher(inputString).replaceAll("\\$0");

Если вы хотите заменить совпадающие части строки на "$0", вы должны написать это
"\\$0". Это потому, что $0 имеет особое значение: совпадающая строка. Таким образом, вы заменяете строку на себя.

Вы неправильно цитируете. Вы не должны цитировать образец. Вы должны поставить в кавычки "a" - часть шаблона, которую следует рассматривать как буквально.

String patternToReplace = String.format(REPLACE_PATTERN, Pattern.quote("a"));

Если вы никогда не собираетесь ставить какие-либо другие буквы во второй аргумент format, то quote вам вообще не нужно, потому что в регулярном выражении буквы не имеют особого значения.

Кроме того, $ имеет особое значение при использовании в качестве замены, поэтому вам нужно избегать его:

inputString = inputString.replaceAll(patternToReplace, "\\$0");
Ответ принят как подходящий

Просто измените inputString.replaceAll(Pattern.quote(patternToReplace), "$0"); на inputString.replaceAll(patternToReplace, "\\$0");

Я тестировал этот код:

public static final String REPLACE_PATTERN = "(?<=^|[^A-Za-z])(%s)(?=[^A-Za-z]|$)";
String patternToReplace = String.format(REPLACE_PATTERN, "a");
inputString = inputString.replaceAll(patternToReplace, "\\$0");
System.out.println(inputString);

Выход :

$0 car4is $05car

Надеюсь, это поможет вам :)

Другие вопросы по теме