Введение в регулярные выражения

Введение

В качестве системных администраторов, разработчиков, инженеров по контролю качества, инженеров поддержки и т. д. часто приходится находить определенный шаблон, например, набор IP-адресов, принадлежащих определенному диапазону, или диапазон временных меток или группы доменных или поддоменных имен, из файлов. Может также потребоваться найти слово, написанное определенным образом, или обнаружить возможные опечатки в файле. Вот где на помощь приходят регулярные выражения.

Регулярные выражения представляют собой шаблоны для сопоставления (или иногда несопоставления) шаблонов. Они предоставляют способ описания и разбора текста. В этом учебнике мы рассмотрим основы регулярных выражений, не вдаваясь в особенности какого-либо языка. Мы просто используем egrep для объяснения концепций.

Регулярные выражения

Регулярные выражения состоят из двух типов символов:

  • обычных литеральных символов и

  • метасимволов

– это те, которые придают силу регулярным выражениям.

Рассмотрим следующий файл country.txt, где первый столбец – название страны, второй столбец – население страны, а третий столбец – континент.

$ cat country.txt
India,1014003817,Asia
Italy,57634327,Europe
Yemen,1184300,Asia
Argentina,36955182,Latin America
Brazil,172860370,Latin America
Cameroon,15421937,Africa
Japan,126549976,Asia

Якорные метасимволы

Первая группа “метасимволов”, о которой мы поговорим, – это ^ и $. ^ и $ соответствуют началу и концу шаблона соответственно и называются якорными метасимволами.

Чтобы узнать название всех стран, название которых начинается с I, мы используем выражение:

$ egrep '^I' country.txt
India,1014003817,Asia
Italy,57634327,Europe

или чтобы узнать все страны, у которых название континента заканчивается на e, мы делаем:

$ egrep 'e$' country.txt
Italy,57634327,Europe

Следующий метасимвол – точка (.), который соответствует любому одному символу. Чтобы соответствовать всем строкам, в которых название страны состоит ровно из 5 символов:

$ egrep '^.....,' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Yemen,1184300,Asia
Japan,126549976,Asia

Как насчет нахождения всех строк, в которых название страны начинается либо с I, либо с J, и название страны состоит из 5 символов?

$ egrep '^[IJ]....,' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Japan,126549976,Asia

[…] называется набором символов или классом символов. Внутри набора символов соответствует только один из заданных символов.

Символ ^ внутри набора символов отрицает набор символов. Следующий пример будет соответствовать названиям стран длиной в пять символов, но не начинающимся ни с I, ни с J.

$ egrep '^[^IJ]....,' country.txt
Yemen,1184300,Asia

Группирующий метасимвол и альтернатива

Для сопоставления всех строк, содержащих Азию или Африку:

$ egrep 'Asia|Africa' country.txt
India,1014003817,Asia
Yemen,1184300,Asia
Cameroon,15421937,Africa
Japan,126549976,Asia

Это также можно сделать, взяв A и a общими.

$ egrep 'A(si|fric)a' country.txt
India,1014003817,Asia
Yemen,1184300,Asia
Cameroon,15421937,Africa
Japan,126549976,Asia

Квантификаторы

Вместо написания

$ egrep '^[IJ]....,' country.txt

мы можем написать

$ egrep '^[IJ].{4},' country.txt

где {} называются квантификаторами. Они определяют, сколько раз должен встречаться символ перед ними.

Мы также можем указать диапазон:

$ egrep '^[IJ].{4,6},' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Japan,126549976,Asia

Это сопоставит названия стран, начинающиеся с I или J и имеющие от 4 до 6 символов после них.

Для квантификаторов доступны некоторые сокращения. Например,

{0,1} эквивалентно ?

$ egrep '^ab{0,1}c$' filename

то же самое, что и

$ egrep '^ab?c' filename

{0,} эквивалентно *

$ egrep '^ab{0,}c$' filename

то же самое, что и

$ egrep '^ab*c' filename

{1,} эквивалентно +

$ egrep '^ab{1,}c$' filename

то же самое, что и

$ egrep '^ab+c' filename

Давайте рассмотрим несколько примеров, включающих выражения, которые мы видели до этого. Здесь вместо поиска в файле мы ищем из стандартного ввода. Случай, который мы используем, заключается в том, что мы знаем, что команда grep (или egrep) ищет шаблон, и если шаблон найден, то выводится вся строка, содержащая шаблон.

Мы бы хотели узнать все возможные способы написания предложения костюм серого цвета был его любимым.

Это выражение будет:

$ egrep 'the gr[ea]y colou?r suit was his favou?rite'
the grey color suit was his favourite
the grey color suit was his favourite

the gray colour suit was his favorite
the gray colour suit was his favorite

Рассматривая вышеуказанное выражение, мы видим, что:

  • серый можно написать как серый или серый

  • цвет можно написать как цвет или цвет, это означает, что u необязательно, поэтому мы используем u?

  • аналогично любимый или любимый может быть написан как люби?мый

Как насчет сопоставления почтового индекса США?

$ egrep '^[0-9]{5}(-[0-9]{4})?$'
83456
83456

83456-

834562

92456-1234
92456-1234

10344-2342-345

Еще один пример сопоставления всех допустимых времен в 24-часовом формате.

$ egrep '^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]'
23:44:02
23:44:02

33:45:11

15:45:33
15:45:33

В приведенном выше примере мы сказали, что если первая цифра часа равна либо 0, либо 1, то вторая может быть любой от 0 до 9. Но если первая цифра – 2, то допустимые значения для второй цифры – 0, 1, 2 или 3.

Граничное слово

Чтобы написать шаблон для сопоставления слов, заканчивающихся на цвет, таких как unicolor, watercolor, multicolor и т. д., но не colorless или colorful. Попробуйте эти примеры сами, чтобы ознакомиться с ними:

$ egrep 'color\>'

Затем, чтобы сопоставить colorless и colorful, но не unicolor, watercolor, multicolor и т. д.

$ egrep '\<color'

Таким образом, чтобы точно сопоставить слово color, мы делаем:

$ egrep '\<color\>'

Обратные ссылки

Предположим, мы хотим сопоставить все слова, которые были введены дважды, например, the the или before before, мы должны использовать обратные ссылки. Обратные ссылки используются для запоминания шаблонов.

Вот пример:

$ egrep "\<the\> \1"

Или общий способ:

$ egrep "\<(.*)\> \1"

Приведенный выше пример можно использовать для поиска всех имен, в которых имя и фамилия совпадают. В случае, если есть более одной пары круглых скобок, то вторая, третья, четвертая и т. д. могут быть ссылками с \2, \3, \4 и т. д.

Это всего лишь введение в мощь регулярных выражений.

Source:
https://www.digitalocean.com/community/tutorials/an-introduction-to-regular-expressions