Skip to content

Instantly share code, notes, and snippets.

@jeffangelion
Last active November 5, 2019 14:30
Show Gist options
  • Save jeffangelion/6a9aed9dc6cb0f9ef9ab0140223883aa to your computer and use it in GitHub Desktop.
Save jeffangelion/6a9aed9dc6cb0f9ef9ab0140223883aa to your computer and use it in GitHub Desktop.
Official InfoWatch(c) Traffic Monitor(c) regex documentation

RUSSIAN

Синтаксис регулярных выражений

При написании регулярного выражения можно пользоваться обозначениями, приведенными в таблице:

Представление Значение Эквивалент Комментарий Пример
\w любая буква [А-яA-zЁё] Будет ловиться буква как кириллического, так и латинского алфавитов вне зависимости от регистра. При этом не ловятся буквы с диакритиками (Àà, Èè, Ùù, Éé, Çç, å) и особые буквы некоторых алфавитов типа норвежских æ, ø. Буквы других алфавитов (арабского, китайского) ловиться не будут. Цифры и нижнее подчёркивание не ловятся. Регулярное выражение Пет\w будет ловить слова "Петя", "Пете", "Петю" "Петр" и т.д.
Регулярное выражение \wоля будет ловить слова "Коля", "коля", "Толя", и т.д.
\W не буква [^А-яA-zЁё] Соответственно, помимо небуквенных знаков типа -!,.?%; № , ловит ещё и буквы с диакритиками и нетипичные буквы алфавитов, составленных на основе латиницы или кириллицы (например, корякскую "ӄ"), а также буквы не кириллического и не латинского алфавита.
\d любая цифра [0-9]
\D не цифра [^0-9] В том числе пробел и перенос строки
\s пробел ( ) Ловит не только пробел, но и табуляцию
\S не пробел (^ ) [^ ] В том числе, не ловит табуляцию
[] символьный класс Внутри скобок задаются символы, один из которых может встретиться в перехватываемой строке Регулярное выражение Пет[яюе] поймает и "Петя", и "Пете", и "Петю". [0-9] соответствует всем цифрам от нуля до девяти. [А-Яа-я]соответствует всем буквам русского алфавита, кроме "Ёё". Также возможна запись [А-я]. [А-Г] соответствует русским заглавным буквам от "А" до "Г" (иначе можно было бы это записать так: [АБВГ], а [А-о] - всем русским заглавным буквам, кроме "Ё", а также русским строчным буквам от "а" до "о", за исключением "ё". Внутри квадратных скобок можно задавать одновременно и записанный с помощью дефиса символьный класс, и ряд обычных символов: [A-zА-я0-9Ёё!,%] будет реагировать на все буквы русского и английского алфавитов, на цифры, а также на восклицательный знак, запятую и знак процента.
[^] исключение из набора [^0-9] – не цифра
* ноль или более {0,} Квантификатор ставится после символа, группы или символьного класса. Является жадным [0-9]* – любое количество цифр, в том числе и ни одной цифры
+ один или более {1,} Квантификатор ставится после символа, группы или символьного класса. Является жадным \w+ – минимум одна буква
() группировка Заключённое в скобки выражение рассматривается как единое целое О(хо)+ – После "О" идет как минимум одно "хо": поймается и "Охо", и "Охохохохохохо"
{} количество повторений Ставится после символа, группы или символьного класса [0-9]{9} – девять любых цифр подряд. [0-9]{2,11} – от двух до одиннадцати любых цифр подряд. \w{0,20} – не больше двадцати букв.
? ноль или один {0,1} Квантификатор ставится после символа, группы или символьного класса. Петр(ушка)? – реагирует как на "Петр", так и на "Петрушка".
| или В ситуации, когда выбор идет между несколькими односимвольными альтернативами, вместо | можно использовать [] Ср. "Пет(я|ю)" и "Пет[яю]" Регулярное выражение паспорт (номер|№) поймает как строку "паспорт номер", так и "паспорт №"
. любой символ (.*) – всё, что угодно (буквы, символы, пунктуационные знаки, разделители любого рода) любое количество раз, в том числе и ноль раз
\ экранирование Экранировать следует те символы, которые являются служебными при написании регулярных выражений: .()[]+? Регулярное выражение [кч]то? ловит слова "кто", "что", "кт" и "чт". Регулярное выражение [кч]то\? ловит только "кто?" и "что?", но не, скажем, "что!"
Внутри символьного класса экранировать требуется только дефиc.
\r\n\t возврат каретки, новая строка, табуляция Поскольку разные текстовые редакторы могут маркировать перенос строки различным образом, надежнее задавать перенос строки в регулярных выражениях так: [\r\n]{1,2} Регулярное выражение бутылка(\t)рома поймает строку вида "бутылкатабуляциярома", но не "бутылкапробелрома".

Про жадность квантификаторов:

В случае, когда в объекте защиты порог встречаемости для тестового объекта больше одного, следует помнить, что квантификаторы * и + являются "жадными", то есть они пытаются съесть максимально длинный кусок строки, на который они могут налезть. Например, мы создали регулярное выражение вида \((.*)\)

Оно предназначено для того, чтобы отлавливать информацию, данную в круглых скобках. Но в строке типа Петя (он был очень любопытен) решил посмотреть, что находится в заброшенном доме (хотя мама просила его туда не лазить). наше выражение увидит только одну группу в скобках, а именно: (он был очень любопытен) решил посмотреть, что находится в заброшенном доме (хотя мама просила его туда не лазить). То есть оно среагирует на самую первую открывающую скобку и на самую последнюю закрывающую. Если бы мы ввели ограничение на то, что в скобках могут быть только символы русского алфавита и пробелы, этого бы не произошло. Так, регулярное выражением вида \([А-я ]+\) поймало бы обе группы в скобках.

Пример регулярного выражения:

(^|([\r\n]{1,2}))Весьма конфиденциально[\r\n]{1,2}Экз\. ?[N№]? ?[0-9]{1,4}[\r\n] {1,2}(веселый|ВЕСЕЛЫЙ) ['"].{0,10}['"][\r\n]{1,2}Степень веселья по шкале [0-9] {1,2}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment