слова исключения при проверке через regexp

Есть метод проверки через регулярки на плохие слова заменяя их ***

Pattern p = Pattern.compile(temp, Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CHARACTER_CLASS);
Matcher m = p.matcher(text);
m.replaceAll("***");

Подскажите как сделать слова исключения например "три рубля" будут заменены на "три ру***" а надо его пропустить при проверке ?


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

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

Так как в temp находится шаблон типа плохое_слово_1|плохое_слово_2, необходимо заключить это выражение в круглые скобки (подмаску) и с обеих сторон добавить по границе слова \b: "\\b(" + temp + ")\\b".

Если нужно также добавить в совпадение повторы того же слова, которые находятся сразу после найденного слова, нужно добавить (?:\\s*\\1)* перед последней границе слова:

"\\b(" + temp + ")(?:\\s*\\1)*\\b"

См. пример.

Подробности

  • \b - граница слова
  • (...|...) - Захватывающая подмаска №1, одно из перечисленных через | слов
  • (?:\s*\1)* - ноль и более повторов 0+ пробельных символов, за которыми следует то же слово, которое было захвачено в первую подмаску
  • \b - граница слова

Если нужен повтор не того же самого слова, а любого слова из заданных в подмаске, используйте

"\\b(?:" + temp + ")(?:\\s*(?:" + temp + "))*\\b"
→ Ссылка