Как мгновенно извлечь из текста даты, номера телефонов, емейлы и другие данные
15 регулярок для Sublime на все случаи жизни.
Пятилетний ребенок разберется, как через поисковое окошко найти в тексте комбинацию цифр »1999» или »1800». А вот как найти все комбинации из четырех цифр идущих подряд? Или все номера телефонов? Или фрагменты текста внутри html-тегов?
Для решения подобных задач (и не только их) несколько десятилетий назад были придуманы регулярные выражения (Regular Expression). Это универсальная система описания текстовых строк, которая применяется в разных приложениях и языках программирования.
На синтаксисе регулярных выражений останавливаться не будем, а сразу перейдем к практике. А когда вы войдете во вкус, расскажем как расширить свой кругозор в этой теме.
В во всех примерах мы будем использовать Sublime Text. Скачать его установочный файл можно на официальном сайте приложения. При желании можно использовать другой текстовый редактор (список программ с поддержкой регулярных выражений есть в конце статьи).
1. Годы
\b\d{4}\b
Итак, у нас есть окно редактора, в котором есть исходный текст и регулярное выражение. Нам нужно сделать следующее:
- 1. Нажать Command+F;
- 2. Сделать активной кнопку .* в левом нижнем углу;
- 3. Вставить регулярное выражение в поисковое окошко и нажать на кнопку Find All;
- 4. Нажать Command+C;
- 5. Нажать Command+N или выбрать нужный документ;
- 6. Нажать Command+V и радоваться результату.
В остальных 14 примерах надо делать тоже самое.
2. Годы с 1900 по 2099
\b(19|20)\d{2}\b
3. Ссылки
(http|ftp|https)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?
4. Адреса электронной почты
\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b
5. Номера телефонов
((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}
6. Почтовые индексы
\b\d{6}\b
7. IP-адреса (IPv4)
(?:[0-9]{1,3}\.){3}[0-9]{1,3}
8. Содержимое html-тегов
(.*?)
9. Значения атрибутов html-тегов
title=["']?((?:.(?!["']?\s+(?:\S+)=|[>"']))+.)["']?
10. Имя+Фамилия
[А-ЯЁ][а-яё]+ [А-ЯЁ][а-яё]+
11. Римские цифры
[MDCLXVI]+
12. Широта/Долгота
-?[0-9]{1,3}(?:\.[0-9]{1,10})?
13. Время
([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]
14. Даты
В форматах дд/мм/гггг, дд-мм-гггг или дд.мм.гггг.
(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})
15. Числа с десятичными дробями
С разделителем запятой:
[-+]?[0-9]*\,?[0-9]+
С разделителем точкой:
[-+]?[0-9]*\.?[0-9]+
Альтернативы
Естественно, на Sublime Text свет клином не сошелся и есть и другие текстовые редакторы с поддержкой регулярных выражений. Скорее всего, как минимум, с несколькими их них вы в определенной степени знакомы:
- Atom;
- BBEdit;
- Brief;
- Elvis;
- Emacs;
- BBEdit;
- Brief;
- Elvis;
- Emacs;
- Microsoft Word;
- NEdit;
- Notepad++;
- NoteTab;
- Nvi;
- PSPad;
- SubEthaEdit;
- TextMate;
- TSE;
- UltraEdit;
- Vile;
- Vim.
Полезные веб-сервисы
На regexr.com можно протестировать регулярные выражения и узнать что обозначают их отдельные синтаксические элементы. Также на этом сайте теоретическая информация по теме.
По моему опыту, люди, которые не знакомы с регулярными выражениями, чаще всего сталкиваются с проблемой, описанной в четвертом пункте этой статьи. Для ее решения можно не заморачиваться, а использовать онлайн-сервис для извлечения email-адресов из текста
Для тех, кто хочет узнать больше
В статье Мой ТОП-9 книг для программистов я упоминала книгу «Регулярные выражения. Сборник рецептов». В ней можно найти много готовых практических примеров, но она не сделает вас «богом регулярок». Для этого понадобится литература посерьезнее.
Авторитетные люди по всему миру рекомендует для глубокого и тонкого понимания этой темы прочитать ставшую классикой книгу Джеффри Фридла «Регулярные выражения».
Но для начала можно пройти онлайн-курс на regexone: