Как экранировать слова в которых есть дефис java

Сейчас пытаюсь экранировать так, но остается "-то"

String result2 = result1.replaceAll("\\кто-то"," ");

Если экранировать так,то остается "то"

String result2 = result1.replaceAll("\\-|\\кто-то"," ");

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

String result2 = result1.replaceAll("\\-|\\кто-то|\\то"," ");

Требуется удалить(заменить на пробел) слова "кто-то", "кто-либо" и тому подобные из имеющейся строки.


Ответы (1 шт):

Автор решения: Wiktor Stribiżew

Вы можете использовать

(?U)\bкто-(?:то|либо)\b

См. пример работы регулярного выражения.

Подробности

  • (?U) - для старых версий Java этот флаг необходим, чтобы граница слова \b правильно работала с Юникодом
  • \b - граница слова
  • кто- - подстрока кто-
  • (?:то|либо) - либо то, либо либо
  • \b - граница слова

См. пример кода на Java:

String text = "Требуется заменить на пробел слова \"кто-то\", \"кто-либо\" и тому подобные из имеющейся строки.";
System.out.println(text.replaceAll("(?U)\\bкто-(?:то|либо)\\b", " "));
// => Требуется заменить на пробел слова " ", " " и тому подобные из имеющейся строки.

Можно далее расширить шаблон до, например,

(?Ui)\b(?:кто|как\p{L}*)-(?:то|либо|нибудь)\b

См. пример работы этого регулярного выражения. Тут \p{L}* находит 0 и более любых букв, а (?i) обеспечивает регистронезависимый поиск.

→ Ссылка