Мне нужно заменить все вхождения слова в строку, когда оно находится между небуквенными символами (цифрами, пробелами и т. д.) или в начале или в конце строки на $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




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
Надеюсь, это поможет вам :)