Как мгновенно извлечь из текста даты, номера телефонов, емейлы и другие данные

15 регулярок для Sublime на все случаи жизни.

Пятилетний ребенок разберется, как через поисковое окошко найти в тексте комбинацию цифр »1999» или »1800». А вот как найти все комбинации из четырех цифр идущих подряд? Или все номера телефонов? Или фрагменты текста внутри html-тегов?

Для решения подобных задач (и не только их) несколько десятилетий назад были придуманы регулярные выражения (Regular Expression). Это универсальная система описания текстовых строк, которая применяется в разных приложениях и языках программирования.

На синтаксисе регулярных выражений останавливаться не будем, а сразу перейдем к практике. А когда вы войдете во вкус, расскажем как расширить свой кругозор в этой теме.

В во всех примерах мы будем использовать Sublime Text. Скачать его установочный файл можно на официальном сайте приложения. При желании можно использовать другой текстовый редактор (список программ с поддержкой регулярных выражений есть в конце статьи).

1. Годы

regular_expression_year

\b\d{4}\b

Итак, у нас есть окно редактора, в котором есть исходный текст и регулярное выражение. Нам нужно сделать следующее:

  1. 1. Нажать Command+F;
  2. 2. Сделать активной кнопку .* в левом нижнем углу;
  3. 3. Вставить регулярное выражение в поисковое окошко и нажать на кнопку Find All;
  4. 4. Нажать Command+C;
  5. 5. Нажать Command+N или выбрать нужный документ;
  6. 6. Нажать Command+V и радоваться результату.

В остальных 14 примерах надо делать тоже самое.

2. Годы с 1900 по 2099

years_from_1900

\b(19|20)\d{2}\b

3. Ссылки

external_link

(http|ftp|https)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?

4. Адреса электронной почты

emails

\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b

5. Номера телефонов

telephone_number

((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}

6. Почтовые индексы

zip_code

\b\d{6}\b

7. IP-адреса (IPv4)

ip_v_4

(?:[0-9]{1,3}\.){3}[0-9]{1,3}

8. Содержимое html-тегов

html_tags

(.*?)

9. Значения атрибутов html-тегов

html_tag_attribute

title=["']?((?:.(?!["']?\s+(?:\S+)=|[>"']))+.)["']?

10. Имя+Фамилия

name_surname

[А-ЯЁ][а-яё]+ [А-ЯЁ][а-яё]+

11. Римские цифры

rim_digits

[MDCLXVI]+

12. Широта/Долгота

lat_long

-?[0-9]{1,3}(?:\.[0-9]{1,10})?

13. Время

hh_mm

([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]

14. Даты

data

В форматах дд/мм/гггг, дд-мм-гггг или дд.мм.гггг.

(?:(?: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. Числа с десятичными дробями

decimal_numbers

С разделителем запятой:

[-+]?[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.

Полезные веб-сервисы

regexp

На regexr.com можно протестировать регулярные выражения и узнать что обозначают их отдельные синтаксические элементы. Также на этом сайте теоретическая информация по теме.

email_extractor

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

Для тех, кто хочет узнать больше

В статье Мой ТОП-9 книг для программистов я упоминала книгу «Регулярные выражения. Сборник рецептов». В ней можно найти много готовых практических примеров, но она не сделает вас «богом регулярок». Для этого понадобится литература посерьезнее.
Авторитетные люди по всему миру рекомендует для глубокого и тонкого понимания этой темы прочитать ставшую классикой книгу Джеффри Фридла «Регулярные выражения».
Но для начала можно пройти онлайн-курс на regexone:
regex_one_online_course

©  iphones.ru