Java - Строка заменит точное слово

String x = "axe pickaxe";
x = x.replace("axe", "sword");
System.out.print(x);

По этому коду я пытаюсь заменить точное слово axe sword. Однако, если я запустил это, он печатает sword picksword то время как я хотел бы напечатать только sword picksword с sword pickaxe, так как pickaxe - это другое слово из axe хотя оно содержит его. Как я могу это исправить? благодаря

Ответы

Ответ 1

Используйте регулярное выражение с границами слов \b:

String s = "axe pickaxe";
System.out.println(s.replaceAll("\\baxe\\b", "sword"));

Обратная косая черта с символа границы должна быть экранирована, следовательно, двойная обратная косая черта.

Ответ 2

Включите границу слова до и после слова, которое вы хотите заменить.

String x = "axe pickaxe axe";
x = x.replaceAll("\\baxe\\b", "sword");
System.out.print(x);

редактирование вывода

sword pickaxe sword

Ответ 3

Некоторые другие ответы предлагают вам использовать границы слова \\b для соответствия точному слову. Но \\bfoo\\b будет соответствовать подстроке foo в .foo. , Если вы не хотите этого типа поведения, вы можете рассмотреть использование regex на основе поворота.

System.out.println(string.replaceAll("(?<!\\S)axe(?!\\S)", "sword"));

Объяснение:

  • (?<!\\S) Отрицательный lookbehind, который утверждает, что совпадению не будет предшествовать непространственный символ. т.е. совпадению должно предшествовать начало границы линии или пробела.

  • (?!\\S) Отрицательный lookahead, который утверждает, что за совпадением не будет следовать непространственный символ, т.е. Соответствие должно сопровождаться концом границы линии или пробела. Мы не можем использовать (?<=^|\\s)axe(?=\\s|$) так как Java не поддерживает утверждения переменной длины lookbehind.

DEMO

Ответ 4

System.out.println("axe pickaxe".replaceAll("\\baxe\\b", "sword"));

Вам нужно использовать replaceAll вместо replace - потому что он может работать с регулярными выражениями. Затем используйте метасимвол \b, который предназначен для границы слова. Чтобы использовать его, вам нужно сбежать с\как double \, так что reges станут \\baxe\\b

Ответ 5

Вы можете использовать \b для определения границы слова, поэтому \baxe\b в этом случае.

x = x.replaceAll("\\baxe\\b");

Ответ 6

Если вы хотите заменить только первое вхождение, в replaceFirst String есть метод replaceFirst.

String x = "axe pickaxe";
x = x.replaceFirst("axe", "sword");
System.out.print(x); //returns sword pickaxe