Добро пожаловать в задания 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 &$#\*@!.  
``` 
---

Поздравляем с окончанием уроков! 
