|
|
|
|
Добро пожаловать в задания https://regexone.com!
|
|
|
|
|
Уроки переведены и адаптированы под выполнение в vim.
|
|
|
|
|
|
|
|
|
|
## Урок 0: Введение и азбука
|
|
|
|
|
|
|
|
|
|
Регулярные выражения чрезвычайно полезны при извлечении информации из текста,
|
|
|
|
|
такого как код, файлы журналов, электронные таблицы или даже документы. И хотя
|
|
|
|
|
за формальными языками стоит много теории, в следующих уроках и примерах будут
|
|
|
|
|
рассмотрены более практические способы использования регулярных выражений, чтобы
|
|
|
|
|
вы могли использовать их на практике как можно быстрее.
|
|
|
|
|
|
|
|
|
|
Первое, что нужно понять при использовании регулярных выражений, это то, что все
|
|
|
|
|
по сути является символом, и мы пишем шаблоны для соответствия определенной
|
|
|
|
|
последовательности символов (также известной как строка). В большинстве шаблонов
|
|
|
|
|
используется обычный ASCII, который включает в себя буквы, цифры, знаки
|
|
|
|
|
препинания и другие символы на клавиатуре, такие как %#$@!, но символы Unicode
|
|
|
|
|
также могут использоваться для соответствия любому типу международного текста.
|
|
|
|
|
|
|
|
|
|
Включите инкрементальный поиск и подсветку найденных строк.
|
|
|
|
|
```
|
|
|
|
|
: set hls is
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Перейдите в режим поиск из нормального режима vim нажав /. Попробуйте найти
|
|
|
|
|
слово "abc". Обратите внимание, как текст подсвечивается, чтобы выделить
|
|
|
|
|
совпадающие символы в каждой строке. Каждый урок будет расширять ваши знания
|
|
|
|
|
синтаксиса регулярных выражений. Вашей задачей будет написать шаблон, который
|
|
|
|
|
соответствует всем строкам урока, которые помечены слово "найдите". Строки
|
|
|
|
|
отмеченные словом "пропустите" не должны находится. В заданиях на замены
|
|
|
|
|
результатом должны быть новая строка.
|
|
|
|
|
|
|
|
|
|
Попробуйте написать шаблон, который соответствует всем трем строкам, это может
|
|
|
|
|
быть так же просто, как общие буквы в каждой строке.
|
|
|
|
|
|
|
|
|
|
Упражнение 1. Сопоставление символов
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
найдите abcdefg
|
|
|
|
|
найдите abcde
|
|
|
|
|
найдите abc
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Урок 1½: 123-е
|
|
|
|
|
|
|
|
|
|
Символы включают в себя обычные буквы, но также и цифры. На самом деле числа 0-9
|
|
|
|
|
тоже просто символы, и если вы посмотрите на таблицу ASCII, то увидите, что они
|
|
|
|
|
перечислены последовательно.
|
|
|
|
|
|
|
|
|
|
На различных уроках вы познакомитесь с рядом специальных метасимволов,
|
|
|
|
|
используемых в регулярных выражениях, которые можно использовать для
|
|
|
|
|
сопоставления определенного типа символов. В этом случае символ \d можно
|
|
|
|
|
использовать вместо любой цифры от 0 до 9. Предыдущий слеш отличает его от
|
|
|
|
|
простого символа d и указывает, что это метасимвол.
|
|
|
|
|
|
|
|
|
|
Ниже приведены еще несколько строк текста, содержащих цифры. Попробуйте написать
|
|
|
|
|
шаблон, который соответствует всем цифрам в приведенных ниже строках, и обратите
|
|
|
|
|
внимание, как ваш шаблон совпадает в любом месте строки, а не только начиная с
|
|
|
|
|
первого символа. Мы узнаем, как ограничивать поиск началом или концом строки
|
|
|
|
|
в одном из следующих уроках.
|
|
|
|
|
|
|
|
|
|
Упражнение 1½: Сопоставление цифр
|
|
|
|
|
```
|
|
|
|
|
найдите цифры в abc123xyz
|
|
|
|
|
найдите цифры в define "123"
|
|
|
|
|
найдите цифры в var g = 123;
|
|
|
|
|
```
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Урок 2: Точка
|
|
|
|
|
|
|
|
|
|
В некоторых карточных играх Джокер является специальной картой, которая может
|
|
|
|
|
выполнять роль любой другой карты в колоде. С помощью регулярных выражений вы
|
|
|
|
|
часто сопоставляете фрагменты текста, точное содержание которых неизвестно, за
|
|
|
|
|
исключением того факта, что они имеют общий шаблон или структуру (например,
|
|
|
|
|
номера телефонов или почтовые индексы).
|
|
|
|
|
|
|
|
|
|
Точно так же существует понятие подстановочного знака, которое представлено
|
|
|
|
|
расширением . (точка) метасимвол и может соответствовать любому одиночному
|
|
|
|
|
символу (букве, цифре, пробелу и т. д.). Вы можете заметить, что это фактически
|
|
|
|
|
отменяет шаблон самого символа точки, поэтому для точного соответствия точке вам
|
|
|
|
|
нужно использовать экранирующий символ - обратный слеш.
|
|
|
|
|
|
|
|
|
|
Ниже приведена пара строк с разными символами, но одинаковой длины. Попробуйте
|
|
|
|
|
написать один шаблон, который может соответствовать первым трем строкам, но не
|
|
|
|
|
последней.
|
|
|
|
|
|
|
|
|
|
Упражнение 2. Сопоставление с подстановочными знаками
|
|
|
|
|
```
|
|
|
|
|
найдите cat.
|
|
|
|
|
найдите 896.
|
|
|
|
|
найдите ?=+.
|
|
|
|
|
пропустите abc1
|
|
|
|
|
```
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Урок 3. Соответствие определенным символам
|
|
|
|
|
|
|
|
|
|
Метасимвол точки из прошлого урока довольно мощный, но иногда слишком мощный.
|
|
|
|
|
Например, если мы сопоставляем номера телефонов, мы не хотим проверять буквы
|
|
|
|
|
«(abc) def-ghij» как действительные числа!
|
|
|
|
|
|
|
|
|
|
Существует метод сопоставления определенных символов с использованием регулярных
|
|
|
|
|
выражений путем перечисления их в квадратных скобках. Например, шаблон [abc]
|
|
|
|
|
будет соответствовать одной из букв a, b или c и ничему другому.
|
|
|
|
|
|
|
|
|
|
Ниже приведена пара строк, где мы хотим сопоставить только первые три строки.
|
|
|
|
|
Обратите внимание, что мы не можем избежать сопоставления последних трех строк,
|
|
|
|
|
если используем точку. Мы должны конкретно определить, какие буквы
|
|
|
|
|
соответствуют шаблону, используя приведенную выше нотацию.
|
|
|
|
|
|
|
|
|
|
Упражнение 3. Сопоставление символов
|
|
|
|
|
```
|
|
|
|
|
найдите can
|
|
|
|
|
найдите man
|
|
|
|
|
найдите fan
|
|
|
|
|
пропуститe dan
|
|
|
|
|
пропуститe ran
|
|
|
|
|
пропуститe pan
|
|
|
|
|
```
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Урок 4. Исключение определенных символов
|
|
|
|
|
|
|
|
|
|
В некоторых случаях мы можем знать, что есть определенные символы, которые мы не
|
|
|
|
|
хотим находить. Например, мы можем захотеть сопоставлять только телефонные
|
|
|
|
|
номера, которые не относятся к коду города 650.
|
|
|
|
|
|
|
|
|
|
Чтобы выразить это, мы используем аналогичное выражение, которое исключает
|
|
|
|
|
определенные символы, используя квадратные скобки и символ карет ^. Например,
|
|
|
|
|
шаблон [^abc] будет соответствовать любому отдельному символу, кроме букв a, b
|
|
|
|
|
или c.
|
|
|
|
|
|
|
|
|
|
С приведенными ниже строками попробуйте написать шаблон, который соответствует
|
|
|
|
|
только животным (свинья, собака), но не болоту. Обратите внимание, что
|
|
|
|
|
большинство шаблонов этого типа также можно написать, используя технику из
|
|
|
|
|
прошлого урока, поскольку они на самом деле являются двумя сторонами одной
|
|
|
|
|
медали. Имея оба варианта, вы можете решить, какой из них легче написать и
|
|
|
|
|
понять при составлении собственных шаблонов.
|
|
|
|
|
|
|
|
|
|
Упражнение 4. Исключение символов
|
|
|
|
|
```
|
|
|
|
|
найдите hog
|
|
|
|
|
найдите dog
|
|
|
|
|
пропустите bog
|
|
|
|
|
```
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Урок 5: Диапазоны символов
|
|
|
|
|
|
|
|
|
|
Мы только что узнали, как создать шаблон, который соответствует или исключает
|
|
|
|
|
определенные символы, но что, если мы хотим сопоставить символ, который может
|
|
|
|
|
находиться в последовательном диапазоне символов? У нас нет другого выбора,
|
|
|
|
|
кроме как перечислить их все?
|
|
|
|
|
|
|
|
|
|
К счастью, при использовании нотации с квадратными скобками есть сокращение для
|
|
|
|
|
сопоставления символа в списке последовательных символов с использованием тире
|
|
|
|
|
для обозначения диапазона символов. Например, шаблон [0-6] будет соответствовать
|
|
|
|
|
только любому однозначному символу от нуля до шести, и никакому другому.
|
|
|
|
|
Аналогично, [^n-p] будет соответствовать только одному символу, кроме букв от n
|
|
|
|
|
до p.
|
|
|
|
|
|
|
|
|
|
В одном и том же наборе квадратных скобок можно использовать несколько
|
|
|
|
|
диапазонов символов вместе с отдельными символами. Примером этого является
|
|
|
|
|
буквенно-цифровой метасимвол \\w, который эквивалентен диапазону символов
|
|
|
|
|
[A-Za-z0-9\_] и часто используется для сопоставления символов в английском
|
|
|
|
|
тексте.
|
|
|
|
|
|
|
|
|
|
В приведенном ниже упражнении обратите внимание на то, что все совпадающие и
|
|
|
|
|
пропускаемые строки имеют шаблон, и используйте обозначение в квадратных
|
|
|
|
|
скобках, чтобы сопоставить или пропустить каждый символ в каждой строке. Имейте
|
|
|
|
|
в виду, что шаблоны чувствительны к регистру, а az отличается от AZ с точки
|
|
|
|
|
зрения символов, которым он соответствует (нижний или верхний регистр).
|
|
|
|
|
|
|
|
|
|
Упражнение 5. Сопоставление диапазонов символов
|
|
|
|
|
```
|
|
|
|
|
найдите Ana
|
|
|
|
|
найдите Bob
|
|
|
|
|
найдите Cpc
|
|
|
|
|
пропуститe aax
|
|
|
|
|
пропуститe bby
|
|
|
|
|
пропуститe ccz
|
|
|
|
|
```
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Урок 6: Ловля zzz
|
|
|
|
|
|
|
|
|
|
Примечание. Некоторые части приведенного ниже синтаксиса повторения
|
|
|
|
|
поддерживаются не во всех реализациях регулярных выражений.
|
|
|
|
|
|
|
|
|
|
До сих пор мы узнали, как указать диапазон символов, которые мы хотим
|
|
|
|
|
сопоставить, но как насчет количества повторений символов, которые мы хотим
|
|
|
|
|
сопоставить? Один из способов сделать это — явно указать, сколько именно
|
|
|
|
|
символов мы хотим, например. \\d\\d\\d, который будет соответствовать ровно трем
|
|
|
|
|
цифрам.
|
|
|
|
|
|
|
|
|
|
Более удобный способ — указать, сколько повторений каждого символа мы хотим,
|
|
|
|
|
используя нотацию фигурных скобок. Например, a{3} будет соответствовать символу
|
|
|
|
|
a ровно три раза. Некоторые механизмы регулярных выражений даже позволяют вам
|
|
|
|
|
указать диапазон для этого повторения, так что {1,3} будет соответствовать
|
|
|
|
|
символу a не более 3 раз, но, например, не менее одного раза.
|
|
|
|
|
|
|
|
|
|
Этот квантификатор можно использовать с любым символом или специальными
|
|
|
|
|
метасимволами, например w{3} (три w), [wxy]{5} (пять символов, каждый из которых
|
|
|
|
|
может быть w, x или y) и .{2. ,6} (от двух до шести любых символов).
|
|
|
|
|
|
|
|
|
|
В приведенных ниже строках последняя строка, содержащая только одну букву z, не
|
|
|
|
|
соответствует правильному написанию сленгового выражения «wazzup?». Попробуйте
|
|
|
|
|
написать шаблон, который соответствует только первым двум вариантам написания,
|
|
|
|
|
используя фигурные скобки выше.
|
|
|
|
|
|
|
|
|
|
Упражнение 6. Сопоставление повторяющихся символов
|
|
|
|
|
```
|
|
|
|
|
найдите wazzzzzup
|
|
|
|
|
найдите wazzzup
|
|
|
|
|
пропустите wazup
|
|
|
|
|
```
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Урок 7: Мистер Клини, мистер Клини
|
|
|
|
|
|
|
|
|
|
Мощной концепцией регулярных выражений является возможность сопоставлять
|
|
|
|
|
произвольное количество символов. Например, представьте, что вы написали форму с
|
|
|
|
|
полем для пожертвований, которое принимает числовое значение в долларах.
|
|
|
|
|
Состоятельный пользователь может зайти и захотеть пожертвовать 25 000 долларов,
|
|
|
|
|
в то время как обычный пользователь может захотеть пожертвовать 25 долларов.
|
|
|
|
|
|
|
|
|
|
Одним из способов выражения такого шаблона было бы использование того, что
|
|
|
|
|
известно как звезда Клини и плюс Клини, которые по существу представляют либо 0
|
|
|
|
|
или более, либо 1 или более символов, за которыми он следует (он всегда следует
|
|
|
|
|
за символом или группой). Например, чтобы сопоставить перечисленные выше
|
|
|
|
|
пожертвования, мы можем использовать шаблон \d* для сопоставления любого
|
|
|
|
|
количества цифр, но более строгим регулярным выражением будет \d+, которое
|
|
|
|
|
гарантирует, что входная строка содержит хотя бы одну цифру.
|
|
|
|
|
|
|
|
|
|
Эти квантификаторы можно использовать с любым символом или специальными
|
|
|
|
|
метасимволами, например, a+ (один или несколько символов a), [abc]+ (один или
|
|
|
|
|
несколько любых символов a, b или c) и .* (ноль или более любых символов). ).
|
|
|
|
|
|
|
|
|
|
Ниже приведены несколько простых строк, которые можно сопоставить, используя
|
|
|
|
|
метасимволы звездочки и плюса.
|
|
|
|
|
|
|
|
|
|
Упражнение 7. Сопоставление повторяющихся символов
|
|
|
|
|
```
|
|
|
|
|
найдите aaaabcc
|
|
|
|
|
найдите aabbbbc
|
|
|
|
|
найдите aacc
|
|
|
|
|
пропустите a
|
|
|
|
|
```
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Урок 8: Необязательные символы
|
|
|
|
|
|
|
|
|
|
Как вы видели, звездочка Клини и плюс позволяют нам сопоставлять повторяющиеся
|
|
|
|
|
символы в строке.
|
|
|
|
|
|
|
|
|
|
Другой квантификатор, который действительно часто используется при сопоставлении
|
|
|
|
|
и извлечении текста, — это ? (вопросительный знак) метасимвол, обозначающий
|
|
|
|
|
опциональность. Этот метасимвол позволяет вам сопоставить либо ноль, либо один
|
|
|
|
|
из предшествующих символов или групп. Например, шаблон ab?c будет
|
|
|
|
|
соответствовать либо строкам «abc», либо «ac», поскольку b считается
|
|
|
|
|
необязательным.
|
|
|
|
|
|
|
|
|
|
Подобно метасимволу точки, вопросительный знак является специальным символом, и
|
|
|
|
|
вам придется экранировать его, используя косую черту ? чтобы соответствовать
|
|
|
|
|
простому символу вопросительного знака в строке.
|
|
|
|
|
|
|
|
|
|
В приведенных ниже строках обратите внимание, как множественность слова «file»
|
|
|
|
|
зависит от количества найденных файлов. Попробуйте написать шаблон, который
|
|
|
|
|
использует метасимвол опциональности для соответствия только строкам, в которых
|
|
|
|
|
был найден один или несколько файлов.
|
|
|
|
|
|
|
|
|
|
Упражнение 8. Сопоставление необязательных символов
|
|
|
|
|
```
|
|
|
|
|
найдите 1 file found?
|
|
|
|
|
найдите 2 files found?
|
|
|
|
|
найдите 24 files found?
|
|
|
|
|
пропустите No files found.
|
|
|
|
|
```
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Урок 9: Все эти пробелы
|
|
|
|
|
|
|
|
|
|
При работе с реальным вводом, таким как файлы журналов и даже пользовательский
|
|
|
|
|
ввод, трудно не столкнуться с пробелами. Мы используем их для форматирования
|
|
|
|
|
фрагментов информации, чтобы ее было легче читать и просматривать визуально, а
|
|
|
|
|
один пробел может испортить простейшее регулярное выражение.
|
|
|
|
|
|
|
|
|
|
Наиболее распространенными формами пробелов, которые вы будете использовать с
|
|
|
|
|
регулярными выражениями, являются пробел ( ), табуляция (\t), новая строка
|
|
|
|
|
(\n) и возврат каретки (\r) (полезно в средах Windows). специальные символы
|
|
|
|
|
соответствуют каждому из соответствующих им пробелов. Кроме того, специальный
|
|
|
|
|
символ пробела \s будет соответствовать любому из указанных выше пробелов и
|
|
|
|
|
чрезвычайно полезен при работе с необработанным входным текстом (не в Vim,
|
|
|
|
|
используйте пробел).
|
|
|
|
|
|
|
|
|
|
В приведенных ниже строках вы обнаружите, что содержимое каждой строки отделено
|
|
|
|
|
некоторым пробелом от индекса строки (число является частью текста для
|
|
|
|
|
соответствия). Попробуйте написать шаблон, который может сопоставлять каждую
|
|
|
|
|
строку, содержащую пробельные символы между числом и содержимым. Обратите
|
|
|
|
|
внимание, что пробельные символы аналогичны любым другим символам, а также могут
|
|
|
|
|
использоваться специальные метасимволы, такие как звездочка и плюс.
|
|
|
|
|
|
|
|
|
|
Упражнение 9: сопоставление пробелов
|
|
|
|
|
```
|
|
|
|
|
найдите 1. abc
|
|
|
|
|
найдите 2. abc
|
|
|
|
|
найдите 3. abc
|
|
|
|
|
пропустите 4.abc
|
|
|
|
|
```
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Урок 10: Начало и конец строки
|
|
|
|
|
|
|
|
|
|
До сих пор мы писали регулярные выражения, которые частично соответствуют
|
|
|
|
|
фрагментам всего текста. Иногда это нежелательно, представьте, например, что мы
|
|
|
|
|
хотим сопоставить слово «success» в файле журнала. Мы, конечно же, не хотим,
|
|
|
|
|
чтобы этот шаблон соответствовал строке с надписью «Error: unsuccessful
|
|
|
|
|
operation»! Вот почему часто рекомендуется писать как можно более конкретные
|
|
|
|
|
регулярные выражения, чтобы гарантировать, что мы не получим ложных срабатываний
|
|
|
|
|
при сопоставлении с реальным текстом.
|
|
|
|
|
|
|
|
|
|
Один из способов сузить шаблоны — определить шаблон, описывающий начало и конец
|
|
|
|
|
строки с помощью специальных метасимволов ^ (карет) и $ (знак доллара). В
|
|
|
|
|
приведенном выше примере мы можем использовать шаблон ^success для соответствия
|
|
|
|
|
только строке, начинающейся со слова «success», но не строке «Error:
|
|
|
|
|
unsuccessful operation». А если вы объедините и карет, и знак доллара, вы
|
|
|
|
|
создадите шаблон, которому соответствует вся строка от начала и до конца.
|
|
|
|
|
|
|
|
|
|
Обратите внимание, что это отличается от карет, используемой внутри набора
|
|
|
|
|
квадратных скобок [^...] для исключения символов, что может сбивать с толку при
|
|
|
|
|
чтении регулярных выражений.
|
|
|
|
|
|
|
|
|
|
Попробуйте сопоставить каждую из приведенных ниже строк, используя новые
|
|
|
|
|
специальные символы.
|
|
|
|
|
|
|
|
|
|
Упражнение 10. Сопоставление линий
|
|
|
|
|
```
|
|
|
|
|
найдите
|
|
|
|
|
Mission: successful
|
|
|
|
|
пропустите
|
|
|
|
|
Last Mission: unsuccessful
|
|
|
|
|
пропустите
|
|
|
|
|
Next Mission: successful upon capture of target
|
|
|
|
|
```
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Урок 11: Сопоставление групп
|
|
|
|
|
|
|
|
|
|
Регулярные выражения позволяют нам не только сопоставлять текст, но и извлекать
|
|
|
|
|
информацию для дальнейшей обработки. Это делается путем определения групп
|
|
|
|
|
символов и их захвата с помощью специальных скобок ( и ) метасимволов. Любой
|
|
|
|
|
подшаблон внутри пары круглых скобок будет захвачен как группа. На практике это
|
|
|
|
|
можно использовать для извлечения такой информации, как номера телефонов или
|
|
|
|
|
электронные письма, из всех видов данных.
|
|
|
|
|
|
|
|
|
|
Представьте, например, что у вас есть инструмент командной строки для вывода
|
|
|
|
|
списка всех файлов изображений, которые у вас хранятся в облаке. Затем вы можете
|
|
|
|
|
использовать шаблон ^(IMG\d+.png)$, чтобы найти и извлечь полное имя файла, но
|
|
|
|
|
если вы хотите захватить только имя файла без расширения, вы можете использовать
|
|
|
|
|
шаблон ^(IMG\d+) .png$, который захватывает только часть до точки.
|
|
|
|
|
|
|
|
|
|
Продолжайте и попробуйте использовать группы, для регулярного выражения, которое
|
|
|
|
|
соответствует только именам файлов pdf (без расширения).
|
|
|
|
|
|
|
|
|
|
В Vim используйте команду ":%s/шаблон/замена/g" для выполнения упражнения.
|
|
|
|
|
В Vim cкобки групп экранируются \(\).
|
|
|
|
|
|
|
|
|
|
Упражнение 11. Сопоставление групп
|
|
|
|
|
```
|
|
|
|
|
найдите группу file_record_transcript в file_record_transcript.pdf
|
|
|
|
|
найдите группу file_07241999 в file_07241999.pdf
|
|
|
|
|
пропустите testfile_fake.pdf.tmp
|
|
|
|
|
```
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Урок 12: Вложенные группы
|
|
|
|
|
|
|
|
|
|
Когда вы работаете со сложными данными, вам может легко понадобиться извлекать
|
|
|
|
|
несколько слоев информации, что может привести к вложенным группам. Как правило,
|
|
|
|
|
результаты захваченных групп находятся в том порядке, в котором они определены
|
|
|
|
|
(в порядке открытия скобок).
|
|
|
|
|
|
|
|
|
|
Возьмем пример из предыдущего урока о захвате имен файлов всех
|
|
|
|
|
изображений.файлы, которые у вас есть в списке. Если бы каждый из этих файлов
|
|
|
|
|
изображений имел последовательный номер изображения в имени файла, вы могли бы
|
|
|
|
|
извлечь и имя файла, и номер изображения, используя один и тот же шаблон,
|
|
|
|
|
написав выражение наподобие ^(IMG(\d+)).png$ (используя вложенный скобки для
|
|
|
|
|
записи цифр).
|
|
|
|
|
|
|
|
|
|
Вложенные группы читаются в шаблоне слева направо, при этом первая группа
|
|
|
|
|
захвата является содержимым первой группы скобок и т. д.
|
|
|
|
|
|
|
|
|
|
Для следующих строк напишите выражение, которое соответствует и фиксирует как
|
|
|
|
|
полную дату, так и год даты.
|
|
|
|
|
|
|
|
|
|
В Vim используйте команду ":%s/шаблон/замена/g" для выполнения упражнения.
|
|
|
|
|
|
|
|
|
|
Упражнение 12. Сопоставление вложенных групп
|
|
|
|
|
```
|
|
|
|
|
извлеките месяц и год из Jan 1987
|
|
|
|
|
извлеките месяц и год из May 1969
|
|
|
|
|
извлеките месяц и год из Aug 2011
|
|
|
|
|
```
|
|
|
|
|
используйте \1, \2 для подстановки группы
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Урок 13: Ещё больше разных групп
|
|
|
|
|
|
|
|
|
|
Как вы видели в предыдущих уроках, все квантификаторы, включая звездочку \*,
|
|
|
|
|
плюс +, повторение {m,n} и вопросительный знак ? все они могут использоваться в
|
|
|
|
|
шаблонах группы захвата. Это единственный способ применить квантификаторы к
|
|
|
|
|
последовательностям символов, а не к отдельным символам.
|
|
|
|
|
|
|
|
|
|
Например, если бы я знал, что номер телефона может содержать или не содержать
|
|
|
|
|
код города, правильный шаблон будет проверять наличие всей группы цифр (\d{3})?
|
|
|
|
|
а не сами отдельные персонажи (что было бы неправильно).
|
|
|
|
|
|
|
|
|
|
В зависимости от используемого механизма регулярных выражений вы также можете
|
|
|
|
|
использовать группы без захвата, которые позволят вам сопоставить группу, но не
|
|
|
|
|
отображать ее в результатах.
|
|
|
|
|
|
|
|
|
|
Ниже приведены несколько различных распространенных разрешений дисплея,
|
|
|
|
|
попробуйте зафиксировать ширину и высоту каждого дисплея.
|
|
|
|
|
|
|
|
|
|
В Vim используйте команду ":%s/шаблон/замена/g" для выполнения упражнения.
|
|
|
|
|
|
|
|
|
|
Упражнение 13. Сопоставление вложенных групп
|
|
|
|
|
```
|
|
|
|
|
извлеките ширину и высоту экрана из 1280x720
|
|
|
|
|
извлеките ширину и высоту экрана из 1920x1600
|
|
|
|
|
извлеките ширину и высоту экрана из 1024x768
|
|
|
|
|
```
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Урок 14: Все условно
|
|
|
|
|
|
|
|
|
|
Как мы упоминали ранее, всегда хорошо быть точным, и это относится к
|
|
|
|
|
кодированию, разговорам и даже регулярным выражениям. Например, вы не станете
|
|
|
|
|
составлять список покупок для кого-то, чтобы купить больше .*, потому что вы не
|
|
|
|
|
представляете, что вы можете получить взамен. Вместо этого вы могли бы написать
|
|
|
|
|
«Купи больше молока» или «Купи больше хлеба», и в регулярных выражениях мы можем
|
|
|
|
|
определить эти условия явно.
|
|
|
|
|
|
|
|
|
|
В частности, при использовании групп вы можете использовать | (логическое ИЛИ,
|
|
|
|
|
также известное как вертикальная черта) для обозначения различных возможных
|
|
|
|
|
наборов символов. В приведенном выше примере я могу написать шаблон «Купить еще
|
|
|
|
|
(молока|хлеба|сока)», чтобы он соответствовал только строкам «Купить еще
|
|
|
|
|
молока», «Купить еще хлеба» или «Купить еще сока».
|
|
|
|
|
|
|
|
|
|
Как и в обычных группах, вы можете использовать любую последовательность
|
|
|
|
|
символов или метасимволов в условии, например, ([cb]ats*|[dh]ogs?)
|
|
|
|
|
соответствует либо кошкам, либо летучим мышам, либо собакам, либо свиньям.
|
|
|
|
|
Написание шаблонов со многими условиями может быть трудным для чтения, поэтому
|
|
|
|
|
вам следует подумать о том, чтобы сделать их отдельными шаблонами, если они
|
|
|
|
|
станут слишком сложными.
|
|
|
|
|
|
|
|
|
|
Попробуйте написать условный шаблон, который соответствует только линиям с
|
|
|
|
|
маленькими нечеткими существами ниже.
|
|
|
|
|
|
|
|
|
|
Упражнение 14. Сопоставление условного текста
|
|
|
|
|
```
|
|
|
|
|
найдите I love cats
|
|
|
|
|
найдите I love dogs
|
|
|
|
|
пропустите I love logs
|
|
|
|
|
пропустите I love cogs
|
|
|
|
|
```
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Урок 15: Другие специальные символы
|
|
|
|
|
|
|
|
|
|
В этом уроке будут рассмотрены некоторые дополнительные метасимволы, а также
|
|
|
|
|
результаты захваченных групп.
|
|
|
|
|
|
|
|
|
|
Мы уже изучили наиболее распространенные метасимволы для записи цифр с помощью
|
|
|
|
|
\d, пробелов с помощью \s и буквенно-цифровых букв и цифр с помощью \w, но
|
|
|
|
|
регулярные выражения также предоставляют способ указания противоположных наборов
|
|
|
|
|
каждого из этих метасимволов с помощью их верхних значений. дела буквы.
|
|
|
|
|
Например, \D представляет собой любой нецифровой символ, \S — любой
|
|
|
|
|
непробельный символ, а \W — любой небуквенно-цифровой символ (например, знак
|
|
|
|
|
препинания). В зависимости от того, как вы составляете свое регулярное
|
|
|
|
|
выражение, может быть проще использовать одно или другое.
|
|
|
|
|
|
|
|
|
|
Кроме того, существует специальный метасимвол \b, который соответствует границе
|
|
|
|
|
между словом и символом, не являющимся словом. Это наиболее полезно при захвате
|
|
|
|
|
целых слов (например, с помощью шаблона \w+\b).
|
|
|
|
|
|
|
|
|
|
Одна концепция, которую мы не будем подробно рассматривать в этих уроках, — это
|
|
|
|
|
обратные ссылки, главным образом потому, что она зависит от реализации. Однако
|
|
|
|
|
многие системы позволяют ссылаться на захваченные группы, используя \0 (обычно
|
|
|
|
|
полный совпадающий текст), \1 (группа 1), \2 (группа 2) и т. д. Это полезно,
|
|
|
|
|
например, когда вы находитесь в текстовом редакторе и выполняя поиск и замену с
|
|
|
|
|
помощью регулярных выражений, чтобы поменять местами два числа, вы можете
|
|
|
|
|
выполнить поиск "(\d+)-(\d+)" и заменить его на "\2-\1", чтобы поставить
|
|
|
|
|
второе захваченное число первым, и первый захваченный номер второй например.
|
|
|
|
|
|
|
|
|
|
Ниже приведены несколько различных строк, попробуйте различные типы метасимволов
|
|
|
|
|
или что-нибудь, чему мы научились на предыдущих уроках, и продолжайте, когда
|
|
|
|
|
будете готовы.
|
|
|
|
|
|
|
|
|
|
Упражнение 15. Сопоставление других специальных символов
|
|
|
|
|
```
|
|
|
|
|
найдите The quick brown fox jumps over the lazy dog.
|
|
|
|
|
найдите There were 614 instances of students getting 90.0% or above.
|
|
|
|
|
найдите The FCC had to censor the network for saying &$#\*@!.
|
|
|
|
|
```
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
Поздравляем с окончанием уроков!
|