Гайд по регэкспам

Гайд по использованию регэкспов в автоскрытии двача. Многое здесь опущено, но приведённого достаточно, чтобы скрыть то, что надо. Как включить автоскрытие расписано с картинками по ссылке.

Экранирование и специальные символы

Регэкспы так устроены, что некоторые символы - специальные и используются в навороченных регэкспах. То есть, если ты захочешь скрыть "сл()во", то правило "сл()во" не сработает. Более того - может скрыть что-то другое. Перечень таких символов:

[ ] / \ ^ $ . | ? * + ( ) 

Чтобы правило с ними заработало, нужно их экранировать - то есть вставить обратный слэш \ перед ними. Правильный регэксп, реагирующий на "сл()во" - это "сл()во"

Заебёшься вставлять слэши? Для этого придуман конвертер, он находится в нижнем левом углу окна автоскрытия. В левое поле вставляешь то, что хочешь скрыть. В правом поле появится это слово с расставленными слэшами. Копируешь и вставляешь в графу "Тема" или "Сообщение".

N.B. Один обратный слэш (как в примере выше) нужен, если ты решил просто вставить правило, нажав кнопку "добавить". Если ты готовишь гигантский файл автоскрытия для импорта, то там все обратные слэши надо удвоить:
["сл()во", "", "", "", "", "", "сл\\(\\)во", ""]
Иначе макаба не примет автоскрытие и выдаст ошибку "Неверный формат".

? - символ либо встретится, либо нет

Вопросительный знак ? означает, что символ перед ним может как встретиться, так и не встретиться. Например, так можно учесть безграмотное написание ться/тся:

хочеть?ся

"хочет" и "ся должно обязательно встретиться, чтобы регэксп сработал, а вот насчёт мягкого знака - вопрос. Поэтому это правило скроет два варианта: "хочется" и "хочеться".
Вопросительный знак может действовать сразу на целую часть строки - для этого надо эту часть строки заключить в скобки. Например,

оцени (внешку )?анона

среагирет как и на "оцени анона", так и на "оцени внешку анона". Читается так: "оцени " встречается обязательно, "внешку " может и не встретиться, "анона" опять обязательно. Заметь, что второй пробел надо добавить в скобки - иначе без скобок регэксп получается "оцени анона" с двумя пробелами, а пост с одним пробелом не скроется.
Можно так действовать и на часть слова:

оцени(ваем)? (внешку )?анона

Действует как предыдущий регэксп, но вместо "оцени" может быть и "оцениваем".

[] - выбор из вариантов символов

В квадратные скобки можно запихнуть несколько символов, каждый из которых может встретиться в строке. Например, так можно учесть неправильное написание слов:

кунч[еи][кг]

Этот регэксп сработает аж на четыре варианта: "кунчик", "кунчиг", "кунчек" и "кунчег". Ещё с квадратными скобками можно учесть замену русских букв на похожие латинские:

[Пп][ЕеEe][РрPp][НнH][Яя][Шш]

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

А вообще, проблему можно решить радикальнее: [а-я][a-z][а-я]. То есть скрыть все посты, где есть слова, где сначала идёт русская буква, потом английская, а потом снова русская. [а-я] обозначает диапазон от А до Я, но о диапазонах символов потом будет подробнее.

Вопросительный знак можно применить сразу ко всей скобке:

кунч[еи]?[кг] 

скроет в том числе и "кунчк" (без буквы Е).

| - выбор из вариантов строк, "ИЛИ"

Для выбора из нескольких вариантов строк используют круглые скобки и вертикальную черту. Так можно запихнуть сразу несколько слов в один регэксп:

фурри|furry

среагирует и на "фурри", и на "furry".
Черту можно использовать в круглых скобках - тогда выбор будет только в части регэкспа.

Так(ая|ие|ой) никогда не буд[еу]т с тобой

среагирует на "такая...", "такой..." и "такие...". Здесь нельзя использовать квадратные скобки, так как выбор не из отдельных символов, а из строк (состоящих из нескольких символов). Тем не менее, заменить квадратные на круглые с чертой можно: ...не буд(е|у)т...

\s - все пробельные символы и другие сочетания со слэшем

Некоторые сочетания обратного слэша с буквой обозначают сразу группу символов.

  • \s - любой пробельный символ. То есть помимо пробела, ваш регэксп будет реагировать ещё и на перевод строки, табуляцию и некоторые другие пробелозаменители. Ставится вместо пробела:
    два\sслова
    
  • \d - любая цифра: 0123456789. Это короткая запись для [0123456789]
  • \b - граница слова значит, что тут либо начинается/заканчивается пост, либо идёт пробел, разделяющий слова. Следующий регэксп скроет слово "ролл", встретившееся отдельно (то есть не в составе другого слова, как "скроллить" или "реролл"):
    \bролл\b
    

Используй это, если не хочешь, чтобы скрылись слова, в которых "ролл" (или что там у тебя) это лишь часть.

[а-я] - указать диапазон символов

У каждого символа есть свой номер в Юникоде. Поэтому можно указать диапазон от одного символа до другого включительно, написав между ними дефис. Также эти диапазон можно складывать, просто написав два таких диапазона подряд. Тут приведу только самое необходимое:

  • [a-z] - буквы латинского алфавита
  • [а-яё] - буквы русского алфавита. Буква Ё - отдельно!
  • [0-9] - все цифры, альтернатива \d

{} - указать число символов

Если нужно указать, что символ или строка могут повторяться, указывают возможный диапазон в фигурных скобках. Фигурные скобки можно ставить после просто букв, круглых скобок или квадратных скобок. Все диапазоны - включительно. Например,

два\s{1,10}слова

скроет посты, где между "два" и "слова" от одного до десяти пробелов.
Можно убрать верхнюю границу - тогда регулярка будет реагировать хоть на тысячу букв подряд. Запятую при этом оставляем. Например,

бля{1,}ть

скроет "блять", "бляять", "бляяять" и так далее, пока клавиатура не треснет.

Полезное применение в сочетании с квадратными скобками - указать все окончания:

инцельск[а-я]{1,3}

скроет все вариации слова "инцельский", во всех родах и падежах.

Точка - любой символ

Точка означает, что на её месте может быть абсолютно любой символ.
Можно использовать в сочетании с фигурными скобками - по сути это будет значить "столько-то символов чего угодно":

в чём .{1,30} не ?прав

скроет всё от "в чём не прав" до "в чём этот уважаемый господин не прав". Вопросительный знак относится к пробелу.

^ $ - начало и конец строки

Чтобы, что пост должен именно начинаться с заданных слов, используют карет (крышечку). Пример:

^(не )?посрал

скроет то, что начинается на "посрал" или "не посрал", но оставит пост, где слово "посрал" встретилось в середине.

Знак доллара используют, чтобы показать конец строки:

с меня нихуя$

скроет пост, который будет заканчиваться на "с меня нихуя".

Можно использовать ^ и $ вместе:

^ролл$

скроет пост, полностью состоящий из слова "ролл".
Символы ^ и $ нельзя помещать в квадратные скобки. Но их можно поместить в круглые скобки, где выбор из вариантов обозначается вертикальной чертой. Разберём альтернативу регэкспу "\bролл\b", о котором было выше:

(^|\s)ролл(\s|$)

"Раскроем" скобки, выписав все варианты. Получается четыре варианта:

1
2
3
4
^ролл\s  - со слова "ролл" начинается пост, далее идёт пробел
^ролл$   - пост полностью состоит из слова "ролл"
\sролл\s  - слово "ролл" стоит между двумя пробелами
\sролл$  - со слова "ролл" начинается пост, далее идёт пробел

То есть регэксп сработает только на отдельное слово - и слово может стоять и в начале, и в середине, и в конце поста. Вместо "ролл" можно подставить любое другое выражение.

Ссылки

Edit

Pub: 08 Jun 2023 19:04 UTC

Views: 595