Skip to content

Instantly share code, notes, and snippets.

@jeffangelion
Last active December 18, 2021 19:39
Show Gist options
  • Save jeffangelion/78f12e8b1afa47fda68441b68e4fbb78 to your computer and use it in GitHub Desktop.
Save jeffangelion/78f12e8b1afa47fda68441b68e4fbb78 to your computer and use it in GitHub Desktop.

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

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

Представление Значение Эквивалент Комментарий Пример
\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,1} Квантификатор ставится после символа, группы или символьного класса. Петр(ушка)? – реагирует как на "Петр", так и на "Петрушка"
() группировка Заключённое в скобки выражение рассматривается как единое целое О(хо)+ – "Охо", "Охохохохохохо", и т.п.
{} количество повторений Ставится после символа, группы или символьного класса [0-9]{9} – девять любых цифр подряд
[0-9]{2,11} – от двух до одиннадцати любых цифр подряд
\w{0,20} – не больше двадцати букв
| или В ситуации, когда выбор идет между несколькими односимвольными альтернативами, вместо | можно использовать [] паспорт (номер|№) – "паспорт номер", "паспорт №"
. любой символ (.*) – любой(ые) символ(ы) любое количество раз (в том числе и ноль)
\ экранирование Экранировать следует те символы, которые являются служебными при написании регулярных выражений:
. \ ( ) [ ] + ?
[кч]то? – "кто", "что", "кт", "чт"
[кч]то\? – "кто?" и "что?", но не "что!"
Внутри символьного класса экранировать требуется только дефи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