Регулярное выражение для нахождения русского мата в тексте. Использовать следует только для первичной модерации, ибо обходится нажатием в одну клавишу. Если вам требуется полноценный фильтра мата, советую прибегнуть к программному пути создания такового, найти третье 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. Также доступен однострочный вариант.
@Versers Я с САМПом никогда не работал, поэтому даже не могу подсказать, есть ли готовые решения в виде скриптов/плагинов.
У вас в скриптинге есть колбэк OnPlayerText - если подключить что-нибудь, что может обрабатывать регулярные выражения (вот что-то есть?) и изменить строки через них - уже на полпути к цели.