Регулярное выражение для нахождения русского мата в тексте. Использовать следует только для первичной модерации, ибо обходится нажатием в одну клавишу. Если вам требуется полноценный фильтра мата, советую прибегнуть к программному пути создания такового, найти третье API, или просто остановиться на ручной модерации.
Выражение писалось в первую очередь с оглядкой на регулярки Java - для других языков может потребоваться адаптация.
\b(
((у|[нз]а|(хитро|не)?вз?[ыьъ]|с[ьъ]|(и|ра)[зс]ъ?|(о[тб]|п[оа]д)[ьъ]?|(.\B)+?[оаеи-])-?)?(
[её](б(?!о[рй]|рач)|п[уа](ц|тс))|
и[пб][ае][тцд][ьъ]
).*?|
((н[иеа]|(ра|и)[зс]|[зд]?[ао](т|дн[оа])?|с(м[еи])?|а[пб]ч|в[ъы]?|пр[еи])-?)?ху([яйиеёю]|л+и(?!ган)).*?|
бл([эя]|еа?)([дт][ьъ]?)?|
\S*?(
п(
[иеё]зд|
ид[аое]?р|
ед(р(?!о)|[аое]р|ик)|
охую
)|
бля([дбц]|тс)|
[ое]ху[яйиеё]|
хуйн
).*?|
(о[тб]?|про|на|вы)?м(
анд([ауеыи](л(и[сзщ])?[ауеиы])?|ой|[ао]в.*?|юк(ов|[ауи])?|е[нт]ь|ища)|
уд([яаиое].+?|е?н([ьюия]|ей))|
[ао]л[ао]ф[ьъ]([яиюе]|[еёо]й)
)|
елд[ауые].*?|
ля[тд]ь|
([нз]а|по)х
)\b
Для удобства чтения маты разделены строками и пробелами. Некоторые маты обрабатываются повторно по-разному для отловки вариаций. Если ваш обработчик регулярных выражений не поддерживает подобное раздельное написание, просто соедините всё в одну непрерывную строку; если ваш текстовый редактор может заменять по регулярке, то достаточно будет заменить [\n\s]
на ничто.
Граница матерных слов определяется с помощью конструкции \b(...)\b
. Для правильной работы также требуются флаги работы с юникодом u
и игнорирования регистра i
. Но, например, в JavaScript якорь \b
с русским языком попросту не работает даже с флагом юникода - придется извертываться.
Далее, рекомендую добавить ?:
к каждой группе, чтобы движок не готовил результаты с ними - на regex101 скорость обработки на Java увеличивается в 2-3 раза; сделать это можно в редакторе текста заменой по регулярке \((?!\?)
на (?:
.
Раньше я занимался вариантом выражения с транскриптом, но его ведение тратит слишком много времени, а обходится оно всё равно очень тривиально. Эту вариацию регулярки для Java можно найти в истории правок этого gist'а, либо напрямую здесь - для других языков можете поискать обсуждения в комментариях.
Ниже можно увидеть готовые выражения, которые я готовлю и обновляю с каждым изменением. Для всех применена оптимизация с ?:
. Если вы не хотите этого - просто замените ?:
на ничто.
- Java. Установлен флаг
x
, который игнорирует пробельные символы в выражении, что позволяет его оставить многострочным. Также доступен однострочный вариант. - JavaScript. Флаги
iu
нужно проставить самостоятельно, например/регулярное выражение/iu
. Начальный и конечный якори\b
заменены на(?<![а-яё])
и(?![а-яё])
соответственно; выражение.\B
заменено на\S(?=[а-яё])
. - Python. Применены те же меры, что в варианте для JavaScript. Установлен флаг
x
, который игнорирует пробельные символы в выражении, что позволяет его оставить многострочным, как в варианте для Java. Также доступен однострочный вариант.
На
(?<=(^|[^а-я]))(([уyu]|[нзnz3][аa]|(хитро|не)?[вvwb][зz3]?[ыьъi]|[сsc][ьъ']|(и|[рpr][аa4])[зсzs]ъ?|([оo0][тбtb6]|[пp][оo0][дd9])[ьъ']?|(.\B)+?[оаеиeo])?-?([еёe][бb6](?!о[рй])|и[пб][ае][тц]).*?|([нn][иеаaie]|([дпdp]|[вv][еe3][рpr][тt])[оo0]|[рpr][аa][зсzc3]|[з3z]?[аa]|с(ме)?|[оo0]([тt]|дно)?|апч)?-?[хxh][уuy]([яйиеёюuie]|ли(?!ган)).*?|([вvw][зы3z]|(три|два|четыре)жды|(н|[сc][уuy][кk])[аa])?-?[бb6][лl]([яy](?!(х|ш[кн]|мб)[ауеыио]).*?|[еэe][дтdt][ь']?)|([рp][аa][сзc3z]|[знzn][аa]|[соsc]|[вv][ыi]?|[пp]([еe][рpr][еe]|[рrp][оиioеe]|[оo0][дd])|и[зс]ъ?|[аоao][тt])?[пpn][иеёieu][зz3][дd9].*?|([зz3][аa])?[пp][иеieu][дd][аоеaoe]?[рrp](ну.*?|[оаoa][мm]|([аa][сcs])?([иiu]([лl][иiu])?[нщктлtlsn]ь?)?|([оo](ч[еиei])?|[аa][сcs])?[кk]([оo]й)?|[юu][гg])[ауеыauyei]?|[мm][аa][нnh][дd]([ауеыayueiи]([лl]([иi][сзc3щ])?[ауеыauyei])?|[оo][йi]|[аоao][вvwb][оo](ш|sh)[ь']?([e]?[кk][ауеayue])?|юк(ов|[ауи])?)|[мm][уuy][дd6]([яyаиоaiuo0].*?|[еe]?[нhn]([ьюия'uiya]|ей))|мля([тд]ь)?|лять|([нз]а|по)х|м[ао]л[ао]фь([яию]|[её]й))(?=($|[^а-я]))
для JSпикает "eb" в Zebra