Читать нас в Telegram
© unsplash.com

Что такое регулярные выражения?

Регулярные выражения (regular expressions, RegEx) — это специальный язык обобщенного описания срок в тексте. Например, на языке регулярных выражений можно легко и компактно описать что-то вроде «любая строка, в которой сначала идут четыре цифры, потом идет дефис или пробел, а потом от 2 до 4 символов латинского алфавита, среди которых нет z». Регулярные выражения используют для поиска или замены строк, для проверки соответствия строк заданному шаблону.

Возможности регулярных выражений встроены в основные современные языки программирования. Хотя RegEx немного отличается для разных языков, базовый синтаксис остаётся одинаковым.

Зачем они нужны?

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

© xkcd

Регулярные выражения можно использовать для поиска дат или особых строк в большом тексте (например, всех вопросительных предложений, в которых меньше пяти слов). Среди более традиционных примеров использования — поиск телефонов, email’ов, ссылок (url), почтовых индексов, номеров карт, ip адресов.

Из чего состоит простое регулярное выражение?

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

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

В столбце «пример выражения» показано, как данный конкретный символ может быть использован для поиска. В столбце «результат» красным выделен текст, который будет найден с помощью примера.

Классы символов позволяют искать какой-то тип знаков, а не конкретную информацию.

Например:

\w — любая одна буква или цифра (к сожалению, это работает только с латинским алфавитом. Как быть с русским, расскажем в следующий раз)

\s — любой один пробельный символ

\d — любая одна цифра (именно цифра от 0 до 9, не все число!)

\n — новая строка

\t — tab

Например,

\w\w — это две буквы подряд («on», «to», «at») или часть более длинного слова («sun»)

\w\w\w — это любые три буквы подряд («the», «how», «cat», «book»)

Если вы хотите найти только наборы символов конкретной длины, можно указать количество повторений в фигурных скобках:

\w{4} — «joke», «bush», «pizza»

А если хочется найти целые слова любой длины, шаблон будет выглядеть следующим образом:

\w+

Внимание! Этот шаблон найдёт все слова, написанные латинским алфавитом и числа, но не увидит дефисы внутри слов, кириллицу и буквы вроде ö и é.

Упражнение урока

Как написать шаблон для извлечения обозначений годов?

Пусть есть текст:

Дом будет построен в 1967 году. Только в нем одном будет установлено 740 газовых плит, то есть в 740 раз больше, чем было их в нашем городе до 1913 года!

Надо извлечь все даты и только их!

Где потренироваться?

В браузере: https://regex101.com/ или https://regexr.com/.

В поле «text» вставьте текст, в котором хотите что-то найти. В поле «expression» — ваше регулярное выражение. Оба сайта подсвечивают найденные подстроки и дают описание, что делает каждая из частей вашего выражения.

На компьютере: установите текстовый редактор Nodepad++ на Windows или BBEdit на Mac OS, оба редактора можно использовать бесплатно.

Ответ

\d{4} или \d\d\d\d

\d+ — неверный ответ, потому что он найдёт числа любой длины, в том числе количество газовых плит (740 газовых плит).