1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Фикс [CHAT] RegEx для русского мата

Тема в разделе "Неподтвержденные плагины", создана пользователем imDaniX, 28 июн 2020.

  1. Автор темы
    imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Или, проще говоря, фильтр мата, а.к.а. антимат.

    Это не плагин, а регулярное выражение для плагинов(а может и чего-то иного) с поддержкой регулярных выражений - Chatty, ChatControl, ChatGuard, UltimateChat и многие другие.

    Обновляемый файл https://gist.github.com/imDaniX/8449f40655fcc1b92ae8d756cbca1264
    Если вы просто хотите регулярку для плагина - скорее всего вам больше подойдёт файл Swears Java-condensed.regex
    , но рекомендую почитать README (первый файл).

    Довольно странно создавать для этого отдельную тему, но я уверен, что я не первый и не последний, кто выискивал нормальную регулярку для отечественного мата, которая бы работал без какого-то пресловутого белого списка, или не являлась бы тупо списком различного мата.

    Всегда существует обход любого антимата, ибо кто ищет - тот всегда найдет, поэтому главной задачей было не заблокировать весь мат на свете, а убрать самые популярные маты при быстром наборе от юзера. Обходчиков же обычно должен карать персонал сервера.
     
    Последнее редактирование: 20 фев 2024
  2. Автор темы
    imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Ап немношк.
    В поисках текстов с матом. Гуглится напряжно - эта бездушная машина скрывает все намёки на текста с матом. Впрочем, на текущий момент всё работает довольно хорошо, блокировок обычных слов не выявлено.
    Регулярное выражение можно проверить здесь https://www.freeformatter.com/java-regex-tester.html
    Транскрипт пока не добавил, но скоро.
     
  3. Sigvegutt

    Sigvegutt Активный участник Пользователь

    Баллы:
    96
    А что, так можно было? :D
    [​IMG]
    Вроде работает, спасибо.
     
  4. Автор темы
    imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Можно, но занятие скучновато, никто на серьезных щах не брался. В конце концов, русский мат весьма гибок, проблематично найти рамки где мат, а где "мандарин" какой-нибудь.
     
  5. Saharo4ek

    Saharo4ek Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    tin
    Поэтому и не брались, процент ложных срабатываний всегда подбирался к 75%, что просто напросто полностью обесценивало работу.
     
  6. Автор темы
    imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Сейчас ложных срабатываний нет, а если есть, то нужно специально выискивать. Слово "хулить" и производные, например. Исправляется буквально двумя символами, но кому-то не нравится, пускай это и не мат.
     
  7. Автор темы
    imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    За последние пару дней добавил блокировки для ещё нескольких матов(на основе найденных списоков мата), плюс улучшил уже существующие.
    Если кто пользуется - сообщите мне, если увидите блокировку нормальных слов.

    Доработка с транскриптом немного затягивается, но всё же будет сделана.
     
  8. Sigvegutt

    Sigvegutt Активный участник Пользователь

    Баллы:
    96
    А куда это можно вставить в Chatty? Да просто если использовать как anti-advertisement, то при написании юникод символов вылезает ошибка:
    Код:
    [ERROR]: Could not pass event AsyncPlayerChatEvent to Chatty v2.18.1
    java.util.regex.PatternSyntaxException: Unclosed group near index 498
    И ещё строчек 10
     
    Последнее редактирование: 19 июл 2020
  9. Автор темы
    imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    В swears.txt, можешь отдельной строкой если что-то уже есть.
     
  10. Sigvegutt

    Sigvegutt Активный участник Пользователь

    Баллы:
    96
    Теперь работает, спасибо.

    То есть это будет так?
    Код:
    (?iu)\b((у.?|[н.?з.?]а.?|(х.?и.?т.?р.?о.?|н.?е.?)...[а.?у.?е.?ы.?]?|([н.?з.?]а.?|п.?о.?)х.?|м.?л.?я.?([т.?д.?]ь.?)?)\b
    Можешь дать небольшой пример?

    А ещё, разве "млять" - это мат и/или оскорбление?)
     
  11. Автор темы
    imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    На самом деле для добавления через-символьности всё же придется извратиться...
    Во-первых, игнорируй всё, что в квадратных скобках - лучше ставить после них. Во-вторых, если видишь видишь круглые скобки, которые начинаются с ?! - тоже лучше не лезть. Далее - когда натыкаешься на ситуацию вроде з? или [ая]? - лучше взять в скобки и сделать (з.?)? или ([ая].?)?
    Основная проблема же там, где есть .*? - это придется вовсе удалить и, если дорабатывать, то только вручную прописывая каждый вариант мата. Я её использовал для нахождения полных слов после "основы", ибо маты в русском слишком уж модульные. А ещё проверка (.\B)+?[оаеи] в е-б сломается(отвечает за все "приставки", что кончаются на о, а, е, и), ибо иначе она может "сожрать" вообще всё сообщение игрока. Впрочем, если у тебя режим блокировки всего сообщения разом, можно её переделать в .+?[оаеи]

    Код:
    (у|[нз].?а|(х.?и.?т.?р.?о|н.?е)?в.?(з.?)?[ыьъ]|с.?[ьъ]|(и|ра).?[зс].?ъ?|(о.?[тб]|п.?о.?д)[ьъ]?)?(.?[её].?б.?(?!о[рй])|.?и.?[пб].?[ае].?[тц]).*?
    В идеале ещё нужно опустить некоторые варианты мата, чтобы не перенапрягать регулярку.
    Это личное ;D Один игрок весь чат изпоганил этим, пришлось добавить. Но я вынес малозначительные проверки в конец, так что удаляется легко.

    Но нужно заметить, что при этом всём сильно теряется точность. Как в плане детекта мата, так и чувствтельности регулярки к обычным словам. Если и собирать ультимативную регулярку - нужно набрать огромную базу мата и собирать регулярное выражение из неё, учитывая возможность использования дополнительных знаков со стороны юзера.
    Впрочем, подумываю о создании ветвистого фильтра работающем на базе данных слов(т.е. без использования регулярных выражений), который бы игнорировал все не-буквенные символы... Но это совсем другая история.
     
    Последнее редактирование: 19 июл 2020
  12. Sigvegutt

    Sigvegutt Активный участник Пользователь

    Баллы:
    96
    Короче говоря, regex = боль.

    В общем, я тут накалякал, правильно ли я сделал?:
    Код:
    (?iu)\b((у.?|[нз].?а.?|(х.?и.?т.?р.?о|н.?е)?в.?(з.?)?[ыьъ]|с.?[ьъ]|(и|ра).?[зс].?ъ?|(о.?[тб]|п.?о.?д)[ьъ]?|(.\B)+?[оаеи])?(.?[её].?б.?(?!о[рй])|и.?[пб].?[ае].?[тц]).*?|(н.?[иеа]|[дп].?о|р.?а.?[зс]|з?а|с.?(м.?е)?|о.?(т|д.?н.?о)?)?х.?у.?([яйиеёю]|л.?и(?!ган)).*?|(в.?[зы]|(три|два|четыре)жды|(н|с.?у.?к.?)а)?б.?л.?(я(?!(х|ш.?к|м.?б)[ауеыио]).*?|[еэ].?[дт])|(р.?а.?[сз]|[зн].?а|[со]|(в.?ы)?|п(р.?[ои]|о.?д)|и.?[зс].?ъ?|[ао].?т)?п.?[иеё].?з.?д.*?|м.?а.?н.?д.?([ауеы]|о.?й|[ао].?в.?о.?ш.?ь?((е.?)?к.?[ауе])?|ю.?к.?(о.?в|[ауи])?)|м.?у.?д.?([аио].*?|(е.?)?н[ьюия])|м.?[ао].?л.?[ао].?ф.?ь.?[яию]|(з.?а)?п.?[ие].?д.?[аое]?р.?((а.?с)?(и(ли)?[нщктл]ь?)?|(о.?(ч.?[еи])?)?к|ю.?г)[ауеы]?|([нз].?а|п.?о.?)х|м.?л.?я.?([тд].?ь)?)\b
    P.S. С этого я проорался: (три|два|четыре)жды|(н|сук)а) :D
    P.P.S. Что там с '*?' ? Как его нужно заменить?
    P.P.P.S. Правда вот обход через ".." или ".," и т.п. не блочит. Это никак не решить?
     
    Последнее редактирование: 19 июл 2020
  13. Автор темы
    imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Коль работает - можно не трогать.
    Можно сделать немного грязи, в целом. Добавить в регулярное выражение (?<ая>[^а-я]*) сразу после (?iu), а вместо .? использовать \k<ая>. Но есть вероятность, что ошибку выдаст. В таком случае можно попробовать заменить .? сразу на [^а-я]*.
     
  14. Sigvegutt

    Sigvegutt Активный участник Пользователь

    Баллы:
    96
    Оно, вроде, теперь работает, но не всегда. Например теперь не блокирует "с.у.к.а"
    Код:
    (?iu)\b((у[^а-я]*|[нз][^а-я]*а[^а-я]*|(х[^а-я]*и[^а-я]*т[^а-я]*р[^а-я]*о|н[^а-я]*е)?в[^а-я]*(з[^а-я]*)?[ыьъ]|с[^а-я]*[ьъ]|(и|ра)[^а-я]*[зс][^а-я]*ъ?|(о[^а-я]*[тб]|п[^а-я]*о[^а-я]*д)[ьъ]?|(.\B)+?[оаеи])?([^а-я]*[её][^а-я]*б[^а-я]*(?!о[рй])|и[^а-я]*[пб][^а-я]*[ае][^а-я]*[тц]).*?|(н[^а-я]*[иеа]|[дп][^а-я]*о|р[^а-я]*а[^а-я]*[зс]|з?а|с[^а-я]*(м[^а-я]*е)?|о[^а-я]*(т|д[^а-я]*н[^а-я]*о)?)?х[^а-я]*у[^а-я]*([яйиеёю]|л[^а-я]*и(?!ган)).*?|(в[^а-я]*[зы]|(три|два|четыре)жды|(н|с.?у.?к.?)а.?)?б[^а-я]*л[^а-я]*(я(?!(х|ш[^а-я]*к|м[^а-я]*б)[ауеыио]).*?|[еэ][^а-я]*[дт])|(р[^а-я]*а[^а-я]*[сз]|[зн][^а-я]*а|[со]|(в[^а-я]*ы)?|п(р[^а-я]*[ои]|о[^а-я]*д)|и[^а-я]*[зс][^а-я]*ъ?|[ао][^а-я]*т)?п[^а-я]*[иеё][^а-я]*з[^а-я]*д.*?|м[^а-я]*а[^а-я]*н[^а-я]*д[^а-я]*([ауеы]|о[^а-я]*й|[ао][^а-я]*в[^а-я]*о[^а-я]*ш[^а-я]*ь?((е[^а-я]*)?к[^а-я]*[ауе])?|ю[^а-я]*к[^а-я]*(о[^а-я]*в|[ауи])?)|м[^а-я]*у[^а-я]*д[^а-я]*([аио].*?|(е[^а-я]*)?н[ьюия])|м[^а-я]*[ао][^а-я]*л[^а-я]*[ао][^а-я]*ф[^а-я]*ь[^а-я]*[яию]|(з[^а-я]*а)?п[^а-я]*[ие][^а-я]*д[^а-я]*[аое]?р[^а-я]*((а[^а-я]*с)?(и(ли)?[нщктл]ь?)?|(о[^а-я]*(ч[^а-я]*[еи])?)?к|ю[^а-я]*г)[ауеы]?|([нз][^а-я]*а|п[^а-я]*о[^а-я]*)х|м[^а-я]*л[^а-я]*я[^а-я]*([тд][^а-я]*ь)?)\b
    Часть с "с.у.к.а":
    Код:
    (в[^а-я]*[зы]|(три|два|четыре)жды|(н|с[^а-я]*у[^а-я]*к[^а-я]*)а.?)
    Оно выдаёт ошибку PatternSyntaxException.
     
  15. Автор темы
    imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    На самом деле здесь блокировка "бл.." с приставкой "сук.." :D Само слово не блокировал, но его можно добавить - в самом конце перед )\b добавить
    Код:
    |сц?уч?(ар|([её]н)?(ышь?|ь?к))[ауеои]
    Жаль, но попытаться стоило.
     
  16. Sigvegutt

    Sigvegutt Активный участник Пользователь

    Баллы:
    96
    ¯\_(ツ)_/¯
    Ладно, добавлю, спасибо.

    Не работает.
    Код:
    с[^а-я]*(ц[^а-я]*)?у[^а-я]*(ч[^а-я]*)?(а[^а-я]*р|([её][^а-я]*н)?(ы[^а-я]*ш[^а-я]*ь?|(ь[^а-я]*)?к))[ауеои]
    Сделал так:
    Код:
    |с[^а-я]*у[^а-я]*к[^а-я]*[ауеои]|с[^а-я]*у[^а-я]*ч[^а-я]*[ая][^а-я]*р[^а-я]*[ауыеои]

    Всё остальное работает, вроде бы, идеально. То есть блочит всё и даже блокирует обходы типа "м..л**я*(;ть" и т.п.
     
    Последнее редактирование: 19 июл 2020
  17. Sigvegutt

    Sigvegutt Активный участник Пользователь

    Баллы:
    96
    Ещё 1 вопрос, как вместо [^а-я]* блокировать только символы "!№;%:?*();_-=.,"?
    Иначе оно блокирует слова типо "бляивать", что может повлечь блокировку не матерных слов.
    Хочется, чтобы оно блокировало только обход типа "б*л..я**т""ь" и т.п.
     
  18. Автор темы
    imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Оно и блокирует только не-русские символы. После "-ля" за всё отвечает .*?
     
  19. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    На самом деле, подозреваю, придётся делать какой-то белый список самых популярных, потому что всё явно не учесть:
    http://orfo.info/poisk.php?s=%EC%E0%ED%E4%E0
    http://orfo.info/poisk.php?sm=%E5%E1%EB
    http://orfo.info/poisk.php?s=%E5%E1
    http://orfo.info/poisk.php?s=%E1%EB%FF

    Также предлагаю опубликовать вариант регулярки в несколько строк, чтобы было проще воспринимать и редактировать. Каждый сможет самостоятельно запретить себе суку с хером.
     
    Последнее редактирование: 25 июл 2020
  20. Автор темы
    imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Ни на одно из этих слов эта регулярка не срабатывает, не считая "хулить", которое я сам упоминал выше, но и это решается парой символов. Хотя, вот в ссылках есть "бляшный" - поправлю в через некоторое время.
    А вот по поводу разделения регулярки на слова - идея хорошая. Скорее всего просто закину дополнительный файлик в гист, а может и в этот добавлю.
     

Поделиться этой страницей