слова исключения при проверке через regexp
Есть метод проверки через регулярки на плохие слова заменяя их ***
Pattern p = Pattern.compile(temp, Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CHARACTER_CLASS);
Matcher m = p.matcher(text);
m.replaceAll("***");
Подскажите как сделать слова исключения например "три рубля" будут заменены на "три ру***" а надо его пропустить при проверке ?
Ответы (1 шт):
Так как в 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"