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