Все зависит от того, что вы понимаете под словом.Возможно, вам лучше определить, что вы понимаете, как разделитель слов: например, пробелы, запятые .... И напишите что-нибудь как
phrase=phrase.replaceAll("([ \\s,.;])" + Pattern.quote(word)+ "([ \\s,.;])","$1$2");
Но вам придется дополнительно проверить наличие вхождений наначало и конец строки Например:
String phrase="bob has a bike bob, bob and boba bob's bike is red and \"bob\" stuff.";
String word="bob";
phrase=phrase.replaceAll("([\\s,.;])" + Pattern.quote(word) + "([\\s,.;])","$1$2");
System.out.println(phrase);
печатает это
bob has a bike , and boba bob's bike is red and "bob" stuff.
Обновление: если вы настаиваете на использовании \b
, считая, что «граница слова» понимает Unicode, вы также можете сделать этот подвох: замените все вхождения '
на какую-нибудь букву Юникода, которая, как вы уверены, не появится в вашем тексте, а затем выполните обратную замену.Пример:
String phrase="bob has a bike bob, bob and boba bob's bike is red and \"bob\" stuff.";
String word="bob";
phrase= phrase.replace("'","ñ").replace('"','ö');
phrase=phrase.replaceAll("\\b" + Pattern.quote(word) + "\\b","");
phrase= phrase.replace('ö','"').replace("ñ","'");
System.out.println(phrase);
ОБНОВЛЕНИЕ: Подводя итог некоторым комментариям ниже: можно ожидать, что \w
и \b
будут иметь то же понятие, что и «символ слова», как почти каждое регулярное выражениедиалект сделать.Ну, Java не: \w
считает ASCII, \b
считает Unicode.Я согласен, что это ужасное несоответствие.
Обновление 2: поскольку в Java 7 (как указано в комментариях) флаг UNICODE_CHARACTER_CLASS позволяет указать согласованное поведение только в Юникоде, см. Например, здесь .