Merge pull request #263 from AHOHNMYC/ru-lang-fixes

Russian language update
This commit is contained in:
Zeeshan Ahmad 2025-03-26 23:48:42 -04:00 committed by GitHub
commit eaf6987888
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -1,20 +1,11 @@
<p align="center"> <p align="center">
<br/> <br/>
<a href="https://github.com/ziishaned/learn-regex"> <a href="https://github.com/ziishaned/learn-regex">
<img src="https://i.imgur.com/bYwl7Vf.png" alt="Learn Regex"> <img src="https://i.imgur.com/bYwl7Vf.png" alt="Учим регулярки">
</a> </a>
<br /><br />
<p>
<a href="https://twitter.com/ziishaned">
<img src="https://img.shields.io/twitter/follow/ziishaned.svg?style=social" />
</a>
<a href="https://github.com/ziishaned">
<img src="https://img.shields.io/github/followers/ziishaned.svg?label=Follow%20%40ziishaned&style=social" />
</a>
</p>
</p> </p>
## Translations: ## Переводы:
* [English](../README.md) * [English](../README.md)
* [German](../translations/README-de.md) * [German](../translations/README-de.md)
@ -33,28 +24,34 @@
* [فارسی](../translations/README-fa.md) * [فارسی](../translations/README-fa.md)
* [עברית](../translations/README-he.md) * [עברית](../translations/README-he.md)
## Что такое Регулярное выражение? ## Что такое Регулярное выражение?
[![](https://img.shields.io/badge/-Download%20PDF%20-0a0a0a.svg?style=flat&colorA=0a0a0a)](https://gum.co/learn-regex) [![](https://img.shields.io/badge/Загрузить%20PDF-0a0a0a.svg)](https://gum.co/learn-regex)
> Регулярное выражение - это группа букв или символов, которая используется для поиска определенного шаблона в тексте. > Регулярное выражение это группа букв или символов, которая используется для поиска определенного шаблона в тексте.
Регулярное выражение - это шаблон, сопоставляемый с искомой строкой слева направо. Регулярное выражение — это шаблон, сопоставляемый с искомой строкой слева
Термин «Регулярное выражение» сложно произносить каждый раз, поэтому, обычно, вы будете сталкиваться с сокращениями "регэкспы" или "регулярки". направо. Термин "Регулярное выражение" сложно произносить каждый раз, поэтому,
обычно, вы будете сталкиваться с сокращениями "регэкспы" или "регулярки".
Регулярные выражения используются для замен текста внутри строк, валидации форм, Регулярные выражения используются для замен текста внутри строк, валидации форм,
извлечений подстрок по определенным шаблонам и множества других вещей. извлечений подстрок по определенным шаблонам и множества других вещей.
Представьте, что вы пишете приложение и хотите установить правила, по которым пользователь выбирает свой юзернейм. Мы хотим, чтобы имя пользователя содержало буквы, цифры, подчеркивания и дефисы. Мы также хотим ограничить количество символов в имени пользователя, чтобы оно не выглядело безобразно. Представьте, что вы пишете приложение и хотите установить правила, по которым
Для этого, используем следующее регулярное выражение: пользователь выбирает свой юзернейм. Мы хотим, чтобы имя пользователя содержало
буквы, цифры, подчеркивания и дефисы. Мы также хотим ограничить количество
символов в имени пользователя, чтобы оно не выглядело безобразно. Для этого
используем следующее регулярное выражение:
<br/><br/> <br/>
<p align="center"> <p align="center">
<img src="../img/regexp-ru.png" alt="Regular expression"> <img src="../img/regexp-ru.png" alt="Регулярное выражение">
</p> </p>
Регулярное выражения выше может принимать строки `john_doe`,`jo-hn_doe` и `john12_as`. Регулярное выражения выше может принимать строки `john_doe`,`jo-hn_doe` и
Оно не валидирует `Jo`, поскольку эта строка содержит заглавные буквы, а также она слишком короткая. `john12_as`. Оно не валидирует `Jo`, поскольку эта строка содержит заглавные
буквы, а также она слишком короткая.
## Содержание ## Содержание
@ -69,8 +66,8 @@
- [Знак вопроса](#233-знак-вопроса) - [Знак вопроса](#233-знак-вопроса)
- [Фигурные скобки](#24-фигурные-скобки) - [Фигурные скобки](#24-фигурные-скобки)
- [Скобочные группы](#25-скобочные-группы) - [Скобочные группы](#25-скобочные-группы)
- [Альтернация](#26-альтернация) - [Перечисление](#26-перечисление)
- [Экранирование](#27-экранирование) - [Экранирование спецсимволов](#27-экранирование-спецсимволов)
- [Якоря](#28-якоря) - [Якоря](#28-якоря)
- [Каретка](#281-каретка) - [Каретка](#281-каретка)
- [Доллар](#282-доллар) - [Доллар](#282-доллар)
@ -84,12 +81,13 @@
- [Поиск без учета регистра](#51-поиск-без-учета-регистра) - [Поиск без учета регистра](#51-поиск-без-учета-регистра)
- [Глобальный поиск](#52-глобальный-поиск) - [Глобальный поиск](#52-глобальный-поиск)
- [Мультистроковый поиск](#53-мультистроковый-поиск) - [Мультистроковый поиск](#53-мультистроковый-поиск)
- [Жадные vs ленивые квантификаторы](#6-жадные-vs-ленивые-квантификаторы) - [Жадная и ленивая квантификация](#6-жадная-и-ленивая-квантификация)
## 1. Совпадения. ## 1. Совпадения.
В сущности, регулярное выражение - это просто набор символов, который мы используем для поиска в тексте. В сущности, регулярное выражение — это просто набор символов, который мы
Например, регулярное выражение `the` состоит из буквы `t`, за которой следует буква `h`, за которой следует буква `e`. используем для поиска в тексте. Например, регулярное выражение `the` состоит из
буквы `t`, за которой следует буква `h`, за которой следует буква `e`.
<pre> <pre>
"the" => The fat cat sat on <a href="#learn-regex"><strong>the</strong></a> mat. "the" => The fat cat sat on <a href="#learn-regex"><strong>the</strong></a> mat.
@ -97,9 +95,11 @@
[Запустить регулярное выражение](https://regex101.com/r/dmRygT/1) [Запустить регулярное выражение](https://regex101.com/r/dmRygT/1)
Регулярное выражение `123` соответствует строке `123`. Регулярное выражение сопоставляется с входной строкой, сравнивая Регулярное выражение `123` соответствует строке `123`. Регулярное выражение
каждый символ в регулярном выражении с каждым символом во входной строке по одному символу за другим. Регулярные выражения сопоставляется с входной строкой посимвольно. Каждый символ в регулярном
обычно чувствительны к регистру, поэтому регулярное выражение `The` не будет соответствовать строке `the`. выражении сравнивается с каждым символом во входной строке, один символ за
другим. Регулярные выражения обычно чувствительны к регистру, поэтому регулярное
выражение `The` не будет соответствовать строке `the`.
<pre> <pre>
"The" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat. "The" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat.
@ -109,30 +109,32 @@
## 2. Метасимволы ## 2. Метасимволы
Метасимволы это блоки, из которых строятся регулярные выражения. Метасимволы не означают что-то сами по себе, Метасимволы — это строительные блоки для регулярных выражений. Метасимволы не
вместо этого они интерпретируются для распознавания специальных групп символов. Некоторые метасимволы имеют ищутся в строке как есть, они интерпретируются особым образом. Некоторые
особые обозначения и пишутся в квадратных скобках. Существуют следующие метасимволы: метасимволы имеют особое значение и пишутся в квадратных скобках. Существуют
следующие метасимволы:
|Метасимволы|Описание| |Метасимвол|Описание|
|:----:|----| |:----:|----|
|.|Точка соответствует любому отдельному символу, кроме разрыва строки.| |.|Точка соответствует любому отдельному символу, кроме перевода строки.|
|[ ]|Класс символов. Находить любые символы заключенные в квадратных скобках.| |[ ]|Класс символов. Заменяет любой из символов, заключенных в квадратных скобках.|
|[^ ]|Отрицание класа символов. Находить любые символы не заключенные в квадратных скобках.| |[^ ]|Отрицание класа символов. Соответствует любом символу, не содержащемуся в квадратных скобках.|
|*|Находить 0 или более повторений предыдущего символа.| |\*|Искать 0 или более повторов предыдущего символа.|
|+|Находить 1 или более повторений предыдущего символа.| |+|Искать 1 или более повторов предыдущего символа.|
|?|Сделать предыдущий символ необязательным.| |?|Делает предыдущий символ необязательным.|
|{n,m}|Скобки. Находить по крайней мере "n" но не более чем "m" повторений предыдущего символа.| |{n,m}|Скобки. Искать не менее "n" и не более "m" повторов предыдущего символа.|
|(xyz)|Группа символов. Находить только символы xyz в указанном порядке.| |(xyz)|Группа символов. Искать только символы xyz в указанном порядке.|
|&#124;|Чередование. Находить либо буквы до, либо буквы после символа.| |&#124;|Чередование. Искать либо знаки до этого символа, либо знаки после символа.|
|&#92;|Экранирование. Позволяет находить зарезервированные символы: <code>[ ] ( ) { } . * + ? ^ $ \ &#124;</code>| |&#92;|Экранирование следующего символа. Позволяет искать специальные знаки: <code>[ ] ( ) { } . * + ? ^ $ \ &#124;</code>|
|^|Обозначает начало пользовательского ввода.| |^|Обозначает начало пользовательского ввода.|
|$|Обозначает конец пользовательского ввода.| |$|Обозначает конец пользовательского ввода.|
## 2.1 Точка ## 2.1 Точка
Точка `.` это простейший пример метасимвола. Метасимвол `.` Точка `.` — это простейший пример метасимвола. Метасимвол `.`
находит любой отдельный символ. Точка не будет находить символы перехода или перевода строки. находит любой отдельный символ. Точка не будет находить символы возврата каретки
Например, регулярное выражение `.ar` обозначает: любой символ, за которым следуют буквы `a` и `r`. (CR) или перевода строки (LF). Например, регулярное выражение `.ar` обозначает
"любой символ, за которым следуют буквы `a` и `r`".
<pre> <pre>
".ar" => The <a href="#learn-regex"><strong>car</strong></a> <a href="#learn-regex"><strong>par</strong></a>ked in the <a href="#learn-regex"><strong>gar</strong></a>age. ".ar" => The <a href="#learn-regex"><strong>car</strong></a> <a href="#learn-regex"><strong>par</strong></a>ked in the <a href="#learn-regex"><strong>gar</strong></a>age.
@ -142,10 +144,11 @@
## 2.2 Набор символов. ## 2.2 Набор символов.
Набор символов также называется классом символов. Квадратные скобки используются Набор символов, также называется классом символов. Для определения набора
для определения набора символов. Дефис используется для указания диапазона символов. символов используются квадратные скобки. Дефис используется для указания
Порядок следования символов, заданный в квадратных скобках, не важен. Например, диапазона символов. Порядок следования символов, заданный в квадратных скобках,
регулярное выражение `[Tt]he` обозначает заглавную `T` или строчную `t`, за которой следуют буквы `h` и `e`. не важен. Например, регулярное выражение `[Tt]he` интерпретируется как
"заглавная `T` или строчная `t`, за которой следуют буквы `h` и `e`".
<pre> <pre>
"[Tt]he" => <a href="#learn-regex"><strong>The</strong></a> car parked in <a href="#learn-regex"><strong>the</strong></a> garage. "[Tt]he" => <a href="#learn-regex"><strong>The</strong></a> car parked in <a href="#learn-regex"><strong>the</strong></a> garage.
@ -153,8 +156,9 @@
[Запустить регулярное выражение](https://regex101.com/r/2ITLQ4/1) [Запустить регулярное выражение](https://regex101.com/r/2ITLQ4/1)
Точка внутри набора символов, однако, обозначает непосредственно точку, как символ. Точка внутри набора символов, внезапно, обозначает непосредственно точку как
Регулярное выражение `ar[.]` обозначает строчную `a`, за которой следует `r`, за которой следует `.` (символ точки). символ. Регулярное выражение `ar[.]` обозначает строчную `a`, за которой следует
`r`, за которой следует `.` (символ точки).
<pre> <pre>
"ar[.]" => A garage is a good place to park a c<a href="#learn-regex"><strong>ar.</strong></a> "ar[.]" => A garage is a good place to park a c<a href="#learn-regex"><strong>ar.</strong></a>
@ -164,8 +168,9 @@
### 2.2.1 Отрицание набора символов ### 2.2.1 Отрицание набора символов
Знак вставки `^` обозначает начало строки, однако, когда вы вписываете его после открытия квадратных скобок, он отрицает набор символов. Карет `^` обозначает начало строки, но если вы поставите его после открывающей
Например, регулярное выражение `[^c]ar` обозначает любой символ, кроме `c`, за которым следуют буквы `a` и `r`. квадратной скобки, он инвертирует набор символов. Например, регулярное выражение
`[^c]ar` обозначает "любой символ, кроме `c`, за которым следуют буквы `a` и `r`".
<pre> <pre>
"[^c]ar" => The car <a href="#learn-regex"><strong>par</strong></a>ked in the <a href="#learn-regex"><strong>gar</strong></a>age. "[^c]ar" => The car <a href="#learn-regex"><strong>par</strong></a>ked in the <a href="#learn-regex"><strong>gar</strong></a>age.
@ -175,16 +180,16 @@
## 2.3 Повторения ## 2.3 Повторения
Символы `+`, `*` или `?` используются для обозначения того сколько раз появляется какой-либо подшаблон. Символы `+`, `*` и `?` используются для обозначения того, сколько раз появляется
Данные метасимволы могут вести себя по-разному, в зависимости от ситуации. символ перед ними. Эти метасимволы ведут себя в разных ситуациях по-разному.
### 2.3.1 Звёздочка ### 2.3.1 Звёздочка
Символ `*` обозначает ноль или более повторений предыдущего совпадения. Символ `*` обозначает ноль или более повторений предыдущего символа. Регулярное
Регулярное выражение `a*` означает ноль или более повторений предыдущего выражение `a*` толкуется как "ноль или более повторений предыдущего строчного
строчного символа `a`. Если же символ появляется после набора или класса символов, символа `a`". Если же символ появляется после набора или класса символов, он
он находит повторения всего набора символов. Например, регулярное выражение `[a-z]*` ищет повторения всего набора символов. Например, регулярное выражение `[a-z]*`
означает любое количество строчных букв в строке. означает "любое количество строчных букв".
<pre> <pre>
"[a-z]*" => T<a href="#learn-regex"><strong>he</strong></a> <a href="#learn-regex"><strong>car</strong></a> <a href="#learn-regex"><strong>parked</strong></a> <a href="#learn-regex"><strong>in</strong></a> <a href="#learn-regex"><strong>the</strong></a> <a href="#learn-regex"><strong>garage</strong></a> #21. "[a-z]*" => T<a href="#learn-regex"><strong>he</strong></a> <a href="#learn-regex"><strong>car</strong></a> <a href="#learn-regex"><strong>parked</strong></a> <a href="#learn-regex"><strong>in</strong></a> <a href="#learn-regex"><strong>the</strong></a> <a href="#learn-regex"><strong>garage</strong></a> #21.
@ -192,11 +197,12 @@
[Запустить регулярное выражение](https://regex101.com/r/7m8me5/1) [Запустить регулярное выражение](https://regex101.com/r/7m8me5/1)
Символы можно комбинировать, так, например, символ `*` может использоваться с метасимволом `.` Символы можно комбинировать. Например, метасимвол `*` может использоваться с
для поиска одной строки с произвольным содержанием `.*`. Символ `*` может использоваться метасимволом `.` для поиска строки с произвольным содержанием: `.*`. Символ `*`
с символом пробела `\s`, чтобы находить строки с символами пробела. Например, выражение может использоваться с символом пробела `\s`, чтобы искать строки с символами
`\s*cat\s*` означает: ноль или более пробелов, за которыми следует слово `cat`, пробела. Например, выражение `\s*cat\s*` означает: "ноль или более пробелов, за
за которым следует ноль или более символов пробела. которыми следует слово `cat`, за которым следует ноль или более символов
пробела".
<pre> <pre>
"\s*cat\s*" => The fat<a href="#learn-regex"><strong> cat </strong></a>sat on the con<a href="#learn-regex"><strong>cat</strong></a>enation. "\s*cat\s*" => The fat<a href="#learn-regex"><strong> cat </strong></a>sat on the con<a href="#learn-regex"><strong>cat</strong></a>enation.
@ -206,9 +212,11 @@
### 2.3.2 Плюс ### 2.3.2 Плюс
Символ `+` соответствует одному или более повторению предыдущего символа. Например, Символ `+` соответствует одному или более повторению предыдущего символа.
регулярное выражение `c.+t` означает строчную `c`, за которой следует по крайней мере один символ, Например, регулярное выражение `c.+t` интерпретируется так: "строчная `c`, за
следом за которым идёт символ `t`. Стоит уточнить, что в данном шаблоне, `t` является последним `t` в предложении. которой следует по крайней мере один любой символ, следом за которым(и) идёт
символ `t`. Стоит уточнить, что в данном шаблоне, `t` является последним `t` в
строке.
<pre> <pre>
"c.+t" => The fat <a href="#learn-regex"><strong>cat sat on the mat</strong></a>. "c.+t" => The fat <a href="#learn-regex"><strong>cat sat on the mat</strong></a>.
@ -219,8 +227,9 @@
### 2.3.3 Знак вопроса ### 2.3.3 Знак вопроса
В регулярном выражении метасимвол `?` делает предыдущий символ необязательным. В регулярном выражении метасимвол `?` делает предыдущий символ необязательным.
Этот символ соответствует нулю или одному экземпляру предыдущего символа. Этот символ соответствует нулю или одному вхождению предыдущего символа.
Например, регулярное выражение `[T]?he` означает необязательную заглавную букву `T`, за которой следуют символы `h` и `e`. Например, регулярное выражение `[T]?he` означает: "необязательная заглавная
буква `T`, за которой следуют символы `h` и `e`".
<pre> <pre>
"[T]he" => <a href="#learn-regex"><strong>The</strong></a> car is parked in the garage. "[T]he" => <a href="#learn-regex"><strong>The</strong></a> car is parked in the garage.
@ -237,8 +246,8 @@
## 2.4 Фигурные скобки ## 2.4 Фигурные скобки
В фигурных скобках, которые также называются квантификаторами, указывается, В фигурных скобках, которые также называются квантификаторами, указывается,
сколько раз символ или группа символов могут повторяться. Например, регулярное выражение сколько раз символ или группа символов могут повторяться. Например, регулярное
`[0-9]{2,3}` означает совпадение не менее 2 но не более 3 цифр в диапазоне от 0 до 9. выражение `[0-9]{2,3}` означает: "от 2 до 3 цифр в диапазоне от 0 до 9.
<pre> <pre>
"[0-9]{2,3}" => The number was 9.<a href="#learn-regex"><strong>999</strong></a>7 but we rounded it off to <a href="#learn-regex"><strong>10</strong></a>.0. "[0-9]{2,3}" => The number was 9.<a href="#learn-regex"><strong>999</strong></a>7 but we rounded it off to <a href="#learn-regex"><strong>10</strong></a>.0.
@ -246,9 +255,9 @@
[Запустить регулярное выражение](https://regex101.com/r/juM86s/1) [Запустить регулярное выражение](https://regex101.com/r/juM86s/1)
Уберём второй номер (цифру 3), тогда, регулярное выражение `[0-9]{2,}` будет означать Мы можем опустить второе число (цифру 3), тогда регулярное выражение `[0-9]{2,}`
совпадение 2 или более цифр. Если мы также удалим запятую, то регулярное выражение будет значить "2 или более цифр". А если мы удалим запятую, регулярное выражение
`[0-9]{3}` будет означать совпадение точно с 3 цифрами. `[0-9]{3}` будет искать ровно 3 цифры.
<pre> <pre>
"[0-9]{2,}" => The number was 9.<a href="#learn-regex"><strong>9997</strong></a> but we rounded it off to <a href="#learn-regex"><strong>10</strong></a>.0. "[0-9]{2,}" => The number was 9.<a href="#learn-regex"><strong>9997</strong></a> but we rounded it off to <a href="#learn-regex"><strong>10</strong></a>.0.
@ -264,13 +273,14 @@
## 2.5 Скобочные группы ## 2.5 Скобочные группы
Скобочные группы это группы подшаблонов, которые написаны в круглых скобках Скобочные группы — это группы подшаблонов, которые написаны в круглых скобках
`(...)`. Как мы уже говорили ранее в регулярном выражении, если мы поставим квантификатор `(...)`. Как мы уже говорили ранее, в регулярном выражении, квантификатор после
после символа, он будет повторять предыдущий символ. Но если мы поставим квантификатор после символа, ищет повторы символа перед квантификатором. Если мы поставим
скобочной группы, он будет искать всю группу. Например, регулярное выражение `(ab)*` соответствует квантификатор после скобочной группы, он будет искать повторы всей группы. К
нулю или более повторений символа "ab". Мы также можем использовать метасимвол чередования `|` примеру, регулярное выражение `(ab)*` соответствует нулю или более повторений
внутри скобочной группы. Например, регулярное выражение `(c|g|p)ar` означает поиск одной из строчных букв `c`, строки "ab". Мы также можем использовать метасимвол чередования `|` внутри
`g` или `p`, за которыми следуют буквы `a` и `r`. скобочной группы. Так, регулярное выражение `(c|g|p)ar` означает: "любая из
строчных букв `c`, `g` или `p`, за которой следуют буквы `a` и `r`".
<pre> <pre>
"(c|g|p)ar" => The <a href="#learn-regex"><strong>car</strong></a> is <a href="#learn-regex"><strong>par</strong></a>ked in the <a href="#learn-regex"><strong>gar</strong></a>age. "(c|g|p)ar" => The <a href="#learn-regex"><strong>car</strong></a> is <a href="#learn-regex"><strong>par</strong></a>ked in the <a href="#learn-regex"><strong>gar</strong></a>age.
@ -278,15 +288,18 @@
[Запустить регулярное выражение](https://regex101.com/r/tUxrBG/1) [Запустить регулярное выражение](https://regex101.com/r/tUxrBG/1)
Обратите внимание, что скобочные группы не только находят, но и захватывают символы для использования на родительском языке. Обратите внимание, что скобочные группы не только находят, но и захватывают
Родительским языком может быть python, javascript или практически любой язык, который реализует использование регулярных выражений как параметров функций. символы для использования в языке программирования. Таким языком может быть
Python, JavaScript и практически любой язык, в котором регулярные выражения
можно использовать в параметрах функций.
### 2.5.1 Не запоминающие скобочные группы ### 2.5.1 Незахватывающие скобочные группы
Бывает так, что группу определить нужно, а вот запоминать их содержимое в массиве не требуется. Бывает так, что группу определить нужно, а вот захватывать её содержимое в
Подобный трюк осуществляется при помощи зарезервированной комбинации `?:` массив не требуется. Подобный трюк осуществляется при помощи специальной
в круглых скобках `(...)`. Например, регулярное выражение `(?:c|g|p)ar` будет находить такие же шаблоны как и комбинации `?:` в круглых скобках `(...)`. Так, регулярное выражение
`(c|g|p)ar`, однако скобочная группа при этом создана не будет. `(?:c|g|p)ar` будет искать те же шаблоны, что и `(c|g|p)ar`, но группа захвата
при этом создана не будет.
<pre> <pre>
"(?:c|g|p)ar" => The <a href="#learn-regex"><strong>car</strong></a> is <a href="#learn-regex"><strong>par</strong></a>ked in the <a href="#learn-regex"><strong>gar</strong></a>age. "(?:c|g|p)ar" => The <a href="#learn-regex"><strong>car</strong></a> is <a href="#learn-regex"><strong>par</strong></a>ked in the <a href="#learn-regex"><strong>gar</strong></a>age.
@ -294,19 +307,20 @@
[Запустить регулярное выражение](https://regex101.com/r/Rm7Me8/1) [Запустить регулярное выражение](https://regex101.com/r/Rm7Me8/1)
Незапоминающиеся группы могут пригодиться, когда они используются в функциях поиска и замены, Незахватывающие группы могут пригодиться, в ситуациях типа найти-и-заменить, или
или в сочетании со скобочными группами, например, для предпросмотра при создании скобочной группы или другого вида выходных данных, вместе со скобочными группами, чтобы не засорять массив из захваченных данных
смотрите также [4. Опережающие и ретроспективные проверки](#4-опережающие-и-ретроспективные-проверки). ненужными строками. Смотрите также [4. Опережающие и ретроспективные проверки](#4-опережающие-и-ретроспективные-проверки).
## 2.6 Альтернация ## 2.6 Перечисление
В регулярных выражениях, вертикальная черта `|` используется для определения альтернации (чередования). В регулярных выражениях вертикальная черта `|` используется для определения
Альтернация по своей сути похожа на оператор ИЛИ между логическими выражениями. Может создаться впечатление, что перечисления (выбора). Перечисление похоже на оператор ИЛИ между выражениями.
чередование это то же самое, что и определение набора символов. Однако, большая разница между ними в том, что Может создаться впечатление, что перечисление — это то же, что и набор символов.
набор символов работает на уровне конкретных символов, в то время как альтернация работает на уровне выражений. Но набор символов работает на уровне конкретных символов, а перечисление
Например, регулярное выражение `(T|t)he|car` объединяет два шаблона (заглавная `T` ИЛИ строчная `t`, с продолжением из `h` и `e`) и шаблон работает на уровне выражений. К примеру, регулярное выражение `(T|t)he|car`
(строчная `c`, затем строчная `a`, за которой следует строчная `r`). Таким образом, в поиске будет участвовать любой из данных шаблонов, значит: либо "заглавная `T` ИЛИ строчная `t`, с продолжением из `h` и `e`", либо
по аналогии с логической операцией ИЛИ в программировании и алгебре выражений. "строчная `c`, затем строчная `a`, за которой следует строчная `r`". Во входных
данных будут искаться оба шаблона, для удобства заключённые в кавычки.
<pre> <pre>
"(T|t)he|car" => <a href="#learn-regex"><strong>The</strong></a> <a href="#learn-regex"><strong>car</strong></a> is parked in <a href="#learn-regex"><strong>the</strong></a> garage. "(T|t)he|car" => <a href="#learn-regex"><strong>The</strong></a> <a href="#learn-regex"><strong>car</strong></a> is parked in <a href="#learn-regex"><strong>the</strong></a> garage.
@ -316,13 +330,15 @@
## 2.7 Экранирование спецсимволов ## 2.7 Экранирование спецсимволов
Обратный слэш `\` используется в регулярных выражениях для экранирования следующего символа. Обратный слэш `\` используется в регулярных выражениях для экранирования
Это позволяет формировать шаблоны с поиском зарезервированных символов, таких как `{ } [ ] / \ + * . $ ^ | ?`. следующего символа. Это позволяет формировать шаблоны с поиском специальных
Для использования спецсимвола в шаблоне необходимо указать символ `\` перед ним. символов, таких как `{ } [ ] / \ + * . $ ^ | ?`. Для использования спецсимвола в
шаблоне необходимо указать символ `\` перед ним.
Как упомянуто выше, символ `.` является зарезервированным и соответствует любому значению, кроме символа новой строки. Например: символ `.` является специальным и соответствует любому знаку, кроме
Бывают ситуации, когда необходимо найти точку в предложении, для таких случаев применимо экранирование. Рассмотрим выражение символа новой строки. Чтобы найти точку во входных данных, воспользуется
`(f|c|m)at\.?`, что соответствует следующему шаблону: строчный символ `f`, `c` или `m`, за которым следует строчные буквы `a` и `t`, с опциональной `.` точкой в конце. выражением `(f|c|m)at\.?`: "строчный символ `f`, `c` или `m`, за которым следует
строчные буквы `a` и `t`, с необязательной `.` точкой в конце".
<pre> <pre>
"(f|c|m)at\.?" => The <a href="#learn-regex"><strong>fat</strong></a> <a href="#learn-regex"><strong>cat</strong></a> sat on the <a href="#learn-regex"><strong>mat.</strong></a> "(f|c|m)at\.?" => The <a href="#learn-regex"><strong>fat</strong></a> <a href="#learn-regex"><strong>cat</strong></a> sat on the <a href="#learn-regex"><strong>mat.</strong></a>
@ -332,19 +348,22 @@
## 2.8 Якоря ## 2.8 Якоря
Понятие якорей в регулярных выражениях используется для обозначения проверок, является ли Якоря в регулярных выражениях используются для проверки, является ли
соответствующий символ начальным или конечным символом входной строки. Якоря бывают двух типов: соответствующий символ первым или последним символом входной строки. Есть два
Первый тип - Каретка `^`, проверяет, является ли соответствующий символ начальным символом в тексте. типа якорей: каретка `^` — проверяет, является ли соответствующий символ первым
Второй тип - Доллар `$`, проверяет, является ли соответствующий символ последним символом входной строки. символом в тексте, и доллар `$` — проверяет, является ли соответствующий символ
последним символом входной строки.
### 2.8.1 Каретка ### 2.8.1 Каретка
Символ каретки `^` используется для проверки, является ли соответствующий символ первым символом входной строки. Символ каретки `^` используется для проверки, является ли соответствующий символ
Если мы применяем следующее регулярное выражение `^a` (если a является начальным символом) для строки `abc`, первым символом входной строки. Если мы применяем следующее регулярное выражение
совпадение будет соответствовать букве `a`. Если же мы используем регулярное выражение `^b` на той же строке, `^a` ('a' является первым символом) для строки `abc`, совпадение будет
мы не получим совпадения, поскольку во входящей строке `abc` "b" не является первым символом. Рассмотрим другое соответствовать букве `a`. Если же мы используем регулярное выражение `^b` на
регулярное выражение: `^(T|t)he`, обозначающее заглавную `T` или строчную `t` как первый символ, за которым следуют той же строке, мы не получим совпадения, поскольку во входящей строке `abc` "b"
символы букв `h` и `e`. Cоответственно: не является первым символом. Рассмотрим другое регулярное выражение: `^(T|t)he`,
оно значит "заглавная `T` или строчная `t` как первый символ, за которым следуют
буквы `h` и `e`". Cоответственно:
<pre> <pre>
"(T|t)he" => <a href="#learn-regex"><strong>The</strong></a> car is parked in <a href="#learn-regex"><strong>the</strong></a> garage. "(T|t)he" => <a href="#learn-regex"><strong>The</strong></a> car is parked in <a href="#learn-regex"><strong>the</strong></a> garage.
@ -361,9 +380,9 @@
### 2.8.2 Доллар ### 2.8.2 Доллар
Символ доллара `$` используется для проверки, является ли соответствующий символ Символ доллара `$` используется для проверки, является ли соответствующий символ
последним символом входной строки. Например, регулярное выражение `(at\.)$` последовательность из последним символом входной строки. Например, регулярное выражение `(at\.)$`
строчной `a`, строчной `t`, и точки `.`, ключевой момент в том, что благодаря доллару этот шаблон будет значит: "последовательность из строчной `a`, строчной `t`, точки `.`, находящая
находить совпадения только в том случае, если будет наблюдаться в конце строки. Например: в конце строки". Пример:
<pre> <pre>
"(at\.)" => The fat c<a href="#learn-regex"><strong>at.</strong></a> s<a href="#learn-regex"><strong>at.</strong></a> on the m<a href="#learn-regex"><strong>at.</strong></a> "(at\.)" => The fat c<a href="#learn-regex"><strong>at.</strong></a> s<a href="#learn-regex"><strong>at.</strong></a> on the m<a href="#learn-regex"><strong>at.</strong></a>
@ -379,29 +398,28 @@
## 3. Наборы сокращений и диапазоны ## 3. Наборы сокращений и диапазоны
Регулярные выражения предоставляют сокращения для часто используемых наборов символов, В регулярных выражениях есть сокращения для часто используемых наборов символов:
которые предлагают удобные сокращения для часто используемых регулярных выражений.
Наборы сокращенных символов следующие:
|Сокращение|Описание| |Сокращение|Описание|
|:----:|----| |:----:|----|
|.|Любой символ кроме символа новой строки| |.|Любой символ, кроме символа перевода строки|
|\w|Поиск буквенно-цифрового диапазона символов: `[a-zA-Z0-9_]`| |\w|Английская буква либо цифра: `[a-zA-Z0-9_]`|
|\W|Поиск не буквенно-цифрового диапазона символов: `[^\w]`| |\W|Любой символ, кроме английских букв и цифр: `[^\w]`|
|\d|Поиск цифр: `[0-9]`| |\d|Цифра: `[0-9]`|
|\D|Поиск всего, что не является цифрой: `[^\d]`| |\D|Поиск всего, что не является цифрой: `[^\d]`|
|\s|Поиск пробелов и символов начала строки: `[\t\n\f\r\p{Z}]`| |\s|Пробел либо символ начала строки: `[\t\n\f\r\p{Z}]`|
|\S|Поиск всего кроме пробелов и символов начала строки: `[^\s]`| |\S|Любой символ, кроме пробела и символа начала строки: `[^\s]`|
## 4. Опережающие и ретроспективные проверки ## 4. Опережающие и ретроспективные проверки
Опережающие и ретроспективные проверки (в английской литературе lookbehind, lookahead) это особый вид Опережающие и ретроспективные проверки (lookbehind, lookahead) — это особый вид
***не запоминающих скобочных групп*** (находящих совпадения, но не добавляющих в массив). ***незахватывающих скобочных групп*** (находящих совпадения, но не добавляющих
Данные проверки используются когда мы знаем, что шаблон предшествует или сопровождается другим шаблоном. в массив совпадений). Данные проверки используются, когда мы знаем, что шаблон
Например, мы хотим получить цену в долларах `$` из следующей входной строки предшествует или сопровождается другим шаблоном. Например, мы хотим получить
`$4.44 and $10.88`. Для этого используем следующее регулярное выражение `(?<=\$)[0-9\.]*`, означающее цену в долларах `$` из следующей входной строки `$4.44 and $10.88`. Для этого
получение всех дробных (с точкой `.`) цифр, которым предшествует знак доллара `$`. Существуют используем следующее регулярное выражение `(?<=\$)[0-9\.]*`, означающее
следующие виды проверок: получение всех дробных (с точкой `.`) цифр, которым предшествует знак доллара
`$`. Существуют следующие виды проверок:
|Символ|Описание| |Символ|Описание|
|:----:|----| |:----:|----|
@ -412,14 +430,17 @@
### 4.1 Положительное опережающее условие ### 4.1 Положительное опережающее условие
Положительное опережающее утверждение (assert) означает, что за первой частью выражения должно следовать Положительное опережающее условие требует, чтобы за первой частью выражения
опережающее выражение (lookahead expression). (по аналогии с условиями, if (..) then (..)). обязательно следовало выражение из условия. Возвращенное совпадение содержит
Возвращенное совпадение содержит только текст, который соответствует первой части выражения. только текст, который соответствует первой части выражения. Для определения
Для определения положительного опережающего условия используются круглые скобки. В этих скобках используется положительного опережающего условия используются круглые скобки. В этих скобках
знак вопроса со знаком равенства: `(?=...)`. Опережающее выражение, записывается в скобках после знака равенства. используется знак вопроса со знаком равенства: `(?=...)`. Опережающее выражение
Рассмотрим пример регулярного выражения: `(T|t)he(?=\sfat)`, обозначающее опциональное наличие строчной `t` или заглавной `T`, записывается внутри скобок после знака равенства. Рассмотрим пример регулярного
следом буквы `h` и `e`. В скобках, мы определяем положительное опережающее условие, которое сообщает движку регулярных выражений выражения: `(T|t)he(?=\sfat)` "заглавная `T` или строчная `t`, следом буквы `h`
информацию о том, что после шаблона `The` или `the` будет следовать слово `fat`. и `e`. Всё это должно быть перед пробелом и словом 'fat'". В скобках мы
определяем положительное опережающее условие, которое говорит библиотеке
регулярных выражений о том, что после шаблона `The` или `the` будет следовать
слово `fat`.
<pre> <pre>
"(T|t)he(?=\sfat)" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat. "(T|t)he(?=\sfat)" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat.
@ -429,11 +450,13 @@
### 4.2 Отрицательное опережающее условие ### 4.2 Отрицательное опережающее условие
Отрицательное опережающее условие работает по обратному принципу: используется, когда нам нужно получить Отрицательное опережающее условие работает по обратному принципу: используется,
все совпадения из входной строки, за которыми НЕ следует определенный шаблон. Отрицательное опережающее условие когда нам нужно получить все совпадения из входной строки, за которыми НЕ
определяется таким же образом, как и позитивное, с той лишь разницей, что вместо равенства `=` мы ставим следует определенный шаблон. Отрицательное опережающее условие определяется
восклицательный знак `!` (отрицание) например: `(?!...)`. Рассмотрим выражение `(T|t)he(?!\sfat)`, в котором мы таким же образом, как и положительное, с той лишь разницей, что вместо равенства
находим все `The` или `the` слова из входной строки, за которыми не следует слово `fat`. `=` мы ставим восклицательный знак `!` (логическое отрицание): `(?!...)`.
Пример: `(T|t)he(?!\sfat)` — ищем слова `The` или `the`, за которыми не следует
пробел и слово `fat`.
<pre> <pre>
"(T|t)he(?!\sfat)" => The fat cat sat on <a href="#learn-regex"><strong>the</strong></a> mat. "(T|t)he(?!\sfat)" => The fat cat sat on <a href="#learn-regex"><strong>the</strong></a> mat.
@ -443,9 +466,10 @@
### 4.3 Положительное ретроспективное условие ### 4.3 Положительное ретроспективное условие
Положительное ретроспективное условие используется чтобы найти все совпадения, которым предшествует Положительное ретроспективное условие используется чтобы найти все совпадения,
определенный шаблон. Условие определяется как `(?<=...)`. Например, выражение `(?<=(T|t)he\s)(fat|mat)` означает, которым предшествует определенный шаблон. Условие определяется как `(?<=...)`.
найти все слова `fat` или `mat` из входной строки, которым предшествует слово `The` или `the`. Например, выражение `(?<=(T|t)he\s)(fat|mat)` означает: "найти все слова `fat`
или `mat` из входной строки, которым предшествует слово `The` или `the`".
<pre> <pre>
"(?<=(T|t)he\s)(fat|mat)" => The <a href="#learn-regex"><strong>fat</strong></a> cat sat on the <a href="#learn-regex"><strong>mat</strong></a>. "(?<=(T|t)he\s)(fat|mat)" => The <a href="#learn-regex"><strong>fat</strong></a> cat sat on the <a href="#learn-regex"><strong>mat</strong></a>.
@ -455,9 +479,10 @@
### 4.4 Отрицательное ретроспективное условие ### 4.4 Отрицательное ретроспективное условие
Отрицательное ретроспективное условие используется чтобы найти все совпадения, которым НЕ предшествует Отрицательное ретроспективное условие используется, чтобы найти все совпадения,
определенный шаблон. Условие определяется как `(?<!...)`. Например, выражение `(?<!(T|t)he\s)(cat)` означает которым НЕ предшествует определенный шаблон. Условие определяется так:
найти все слова `cat` из входной строки, которым не предшествует определенный артикль `The` или `the`. `(?<!...)`. Выражение `(?<!(T|t)he\s)(cat)` означает "найти все слова `cat` из
входной строки, которым не предшествует определенный артикль `The` или `the`".
<pre> <pre>
"(?&lt;!(T|t)he\s)(cat)" => The cat sat on <a href="#learn-regex"><strong>cat</strong></a>. "(?&lt;!(T|t)he\s)(cat)" => The cat sat on <a href="#learn-regex"><strong>cat</strong></a>.
@ -467,22 +492,23 @@
## 5. Флаги ## 5. Флаги
Флаги, также называемые модификаторами, изменяют вывод регулярного выражения. Флаги, также называемые модификаторами, изменяют принцип работы регулярного
Эти флаги могут быть использованы в любом порядке или комбинации, и являются выражения. Эти флаги могут быть использованы в любом порядке или комбинации, и
неотъемлемой частью регулярных выражений. являются неотъемлемой частью регулярных выражений.
|Флаг|Описание| |Флаг|Описание|
|:----:|----| |:----:|----|
|i|Поиск без учета регистра| |i|Поиск без учета регистра.|
|g|Глобальный поиск: поиск шаблона во всем входном тексте| |g|Глобальный поиск: искать все вхождения шаблона в тексте, а не только первое совпадение.|
|m|Мультистроковый поиск: Якоря применяются к каждой строке.| |m|Мультистроковый поиск: якоря применяются к строкам, а не ко всему тексту.|
### 5.1 Поиск без учета регистра ### 5.1 Поиск без учета регистра
Модификатор `i` используется для поиска без учета регистра. Например, регулярное выражение Модификатор `i` используется для поиска без учета регистра. Например, регулярное
`/The/gi` означает заглавную `T` следом строчные `h` и `e`. В конце регулярного выражения флаг `i`, выражение `/The/gi` означает заглавную `T` следом строчные `h` и `e`. В конце
указывающий движку регулярных выражений игнорировать регистр. Помимо `i`, для поиска шаблона во регулярного выражения флаг `i`, указывающий библиотеке регулярных выражений
всем входном тексте, использован флаг `g`. игнорировать регистр символов. Дополнительно для поиска шаблона во всем входном
тексте, использован флаг `g`.
<pre> <pre>
"The" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat. "The" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat.
@ -498,10 +524,12 @@
### 5.2 Глобальный поиск ### 5.2 Глобальный поиск
Модификатор `g` используется для выполнения глобального сопоставления (найти все совпадения, а не останавливаться после первого). Модификатор `g` используется для выполнения глобального сопоставления (найти все
Например, регулярное выражение `/.(at)/g` означает любой символ кроме символа новой строки, следом строчная `a`, далее строчная `t`. совпадения, а не останавливаться после первого). К примеру, регулярное выражение
Из-за использования флага `g` в конце регулярного выражения, теперь оно найдет все совпадения во входной строке, а не остановится на первом `/.(at)/g` означает: "любой символ (кроме начала новой строки), следом строчная
(что является поведением по умолчанию). `a` и `t`". Благодаря флагу `g`, такое регулярное выражение найдёт все
совпадения во входной строке, а не остановится на первом (что является
поведением по умолчанию).
<pre> <pre>
"/.(at)/" => The <a href="#learn-regex"><strong>fat</strong></a> cat sat on the mat. "/.(at)/" => The <a href="#learn-regex"><strong>fat</strong></a> cat sat on the mat.
@ -518,11 +546,12 @@
### 5.3 Мультистроковый поиск ### 5.3 Мультистроковый поиск
Модификатор `m` используется для многострочного поиска. Как мы обсуждали ранее, Модификатор `m` используется для многострочного поиска. Как мы обсуждали ранее,
якоря `(^, $)` используются для проверки, является ли шаблон началом или концом входной строки. якоря `(^, $)` используются для проверки, является ли шаблон началом или концом
Но если мы хотим, чтобы якоря работали в каждой строке, мы используем флаг `m`. Например, входных данных. Но если мы хотим, чтобы якоря работали в каждой строке, мы
регулярное выражение `/at(.)?$/gm` означает строчную `a`, следом строчная `t` и любой используем флаг `m`. Например, регулярное выражение `/at(.)?$/gm` означает:
символ кроме начала новой строки, идущий опционально (не обязательно). Из-за флага `m` механизм "строчная `a`, следом строчная `t` и необязательный любой символ (кроме начала
регулярных выражений будет искать данный шаблон в конце каждой строки в тексте. новой строки)". Благодаря флагу `m` библиотека регулярных выражений будет искать
данный шаблон в конце каждой строки в тексте.
<pre> <pre>
"/.at(.)?$/" => The fat "/.at(.)?$/" => The fat
@ -540,30 +569,33 @@
[Запустить регулярное выражение](https://regex101.com/r/E88WE2/1) [Запустить регулярное выражение](https://regex101.com/r/E88WE2/1)
## 6. Жадные vs ленивые квантификаторы ## 6. Жадная и ленивая квантификация
По умолчанию регулярное выражение выполняет жадное сопоставление, то есть оно будет По умолчанию регулярное выражение выполняет жадное сопоставление, то есть оно
искать совпадения как можно дольше. Мы можем использовать `?` для ленивого поиска, который будет искать самые длинные возможные совпадения. Мы можем использовать `?` для
будет стремиться быть как можно более коротким по времени. ленивого поиска, который будет искать наименьшие возможные совпадения во входных
данных.
<pre> <pre>
"/(.*at)/" => <a href="#learn-regex"><strong>The fat cat sat on the mat</strong></a>. </pre> "/(.*at)/" => <a href="#learn-regex"><strong>The fat cat sat on the mat</strong></a>.
</pre>
[Запустить регулярное выражение](https://regex101.com/r/AyAdgJ/1) [Запустить регулярное выражение](https://regex101.com/r/AyAdgJ/1)
<pre> <pre>
"/(.*?at)/" => <a href="#learn-regex"><strong>The fat</strong></a> cat sat on the mat. </pre> "/(.*?at)/" => <a href="#learn-regex"><strong>The fat</strong></a> cat sat on the mat.
</pre>
[Запустить регулярное выражение](https://regex101.com/r/AyAdgJ/2) [Запустить регулярное выражение](https://regex101.com/r/AyAdgJ/2)
## Содействие ## Участвуйте в жизни репозитория
* Вы можете открыть пулл реквест с улучшением * Откройте пулл реквест с исправлением
* Обсуждать идеи в issues * Обсуждайте идеи в issues
* Распространять ссылку на репозиторий * Распространяйте знания и ссылку на репозиторий
* Получить обратную связь через [![Twitter URL](https://img.shields.io/twitter/url/https/twitter.com/ziishaned.svg?style=social&label=Follow%20%40ziishaned)](https://twitter.com/ziishaned) * Приходите с отзывами к [![@ziishaned в Twitter](https://img.shields.io/twitter/url/https/twitter.com/ziishaned.svg?style=social&label=%40ziishaned)](https://twitter.com/ziishaned)
## Лицензия ## Лицензия