Merge pull request #150 from Seasle/master

Fixes
This commit is contained in:
Zeeshan Ahmad 2019-08-02 20:49:26 +04:00 committed by GitHub
commit 4156c6eba9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -33,12 +33,12 @@
> Регулярное выражение - это группа букв или символов, которая используется для поиска определенного шаблона в тексте. > Регулярное выражение - это группа букв или символов, которая используется для поиска определенного шаблона в тексте.
Регулярное выражение - это шаблон, сопоставляемый с искомой строкой слева направо. Регулярное выражение - это шаблон, сопоставляемый с искомой строкой слева направо.
Термин «Регулярное выражение» сложно произносить каждый раз, поэтому, обычно, вы будете сталкиваться с сокращениями "регэкспы" или "регулярки". Термин «Регулярное выражение» сложно произносить каждый раз, поэтому, обычно, вы будете сталкиваться с сокращениями "регэкспы" или "регулярки".
Регулярные выражения используются для замен текста внутри строк, валидации форм, Регулярные выражения используются для замен текста внутри строк, валидации форм,
извлечений подстрок по определенным шаблонам и множества других вещей. извлечений подстрок по определенным шаблонам и множества других вещей.
Представьте, что вы пишете приложение и хотите установить правила, по которым пользователь выбирает свой юзернейм. Мы хотим, чтобы имя пользователя содержало буквы, цифры, подчеркивания и дефисы. Мы также хотим ограничить количество символов в имени пользователя, чтобы оно не выглядело безобразно. Представьте, что вы пишете приложение и хотите установить правила, по которым пользователь выбирает свой юзернейм. Мы хотим, чтобы имя пользователя содержало буквы, цифры, подчеркивания и дефисы. Мы также хотим ограничить количество символов в имени пользователя, чтобы оно не выглядело безобразно.
Для этого, используем следующее регулярное выражение: Для этого, используем следующее регулярное выражение:
@ -47,7 +47,7 @@
<img src="../img/regexp-ru.png" alt="Regular expression"> <img src="../img/regexp-ru.png" alt="Regular expression">
</p> </p>
Регулярное выражения выше может принимать строки `john_doe`,` jo-hn_doe` и `john12_as`. Регулярное выражения выше может принимать строки `john_doe`,`jo-hn_doe` и `john12_as`.
Оно не валидирует `Jo`, поскольку эта строка содержит заглавные буквы, а также она слишком короткая. Оно не валидирует `Jo`, поскольку эта строка содержит заглавные буквы, а также она слишком короткая.
## Содержание ## Содержание
@ -82,8 +82,8 @@
## 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.
@ -91,9 +91,9 @@
[Запустить регулярное выражение](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.
@ -104,7 +104,7 @@
## 2. Метасимволы ## 2. Метасимволы
Метасимволы это блоки, из которых строятся регулярные выражения. Метасимволы не означают что-то сами по себе, Метасимволы это блоки, из которых строятся регулярные выражения. Метасимволы не означают что-то сами по себе,
вместо этого они интерпретируются для распознавания специальных групп символов. Некоторые метасимволы имеют вместо этого они интерпретируются для распознавания специальных групп символов. Некоторые метасимволы имеют
особые обозначения и пишутся в квадратных скобках. Существуют следующие метасимволы: особые обозначения и пишутся в квадратных скобках. Существуют следующие метасимволы:
|Метасимволы|Описание| |Метасимволы|Описание|
@ -119,14 +119,14 @@
|(xyz)|Группа символов. Находить только символы xyz в указанном порядке.| |(xyz)|Группа символов. Находить только символы xyz в указанном порядке.|
|&#124;|Чередование. Находить либо буквы до, либо буквы после символа.| |&#124;|Чередование. Находить либо буквы до, либо буквы после символа.|
|&#92;|Экранирование. Позволяет находить зарезервированные символы: <code>[ ] ( ) { } . * + ? ^ $ \ &#124;</code>| |&#92;|Экранирование. Позволяет находить зарезервированные символы: <code>[ ] ( ) { } . * + ? ^ $ \ &#124;</code>|
|^|Обозначает начало пользовательского ввода.| |^|Обозначает начало пользовательского ввода.|
|$|Обозначает конец пользовательского ввода.| |$|Обозначает конец пользовательского ввода.|
## 2.1 Точка ## 2.1 Точка
Точка `.` это простейший пример метасимвола. Метасимвол `.` Точка `.` это простейший пример метасимвола. Метасимвол `.`
находит любой отдельный символ. Точка не будет находить символы перехода или перевода строки. находит любой отдельный символ. Точка не будет находить символы перехода или перевода строки.
Например, регулярное выражение '.ar' обозначает: любой символ, за которым следуют буквы ` a` и `r`. Например, регулярное выражение `.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.
@ -137,9 +137,9 @@
## 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.
@ -147,8 +147,8 @@
[Запустить регулярное выражение](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>
@ -158,8 +158,8 @@
### 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.
@ -169,15 +169,15 @@
## 2.3 Повторения ## 2.3 Повторения
Символы `+`, `*` or `?` используются для обозначения того, как сколько раз появляется какой-либо подшаблон. Символы `+`, `*` или `?` используются для обозначения того, как сколько раз появляется какой-либо подшаблон.
Данные метасимволы могут вести себя по-разному, в зависимости от ситуации. Данные метасимволы могут вести себя по-разному, в зависимости от ситуации.
### 2.3.1 Звёздочка ### 2.3.1 Звёздочка
Символ `*` обозначает ноль или более повторений предыдущего совпадения. Символ `*` обозначает ноль или более повторений предыдущего совпадения.
Регулярное выражение `a *` означает ноль или более повторений предыдущего Регулярное выражение `a*` означает ноль или более повторений предыдущего
строчного символа `a`. Если же символ появляется после набора или класса символов, строчного символа `a`. Если же символ появляется после набора или класса символов,
он находит повторения всего набора символов. Например, регулярное выражение `[a-z] *` он находит повторения всего набора символов. Например, регулярное выражение `[a-z]*`
означает любое количество строчных букв в строке. означает любое количество строчных букв в строке.
<pre> <pre>
@ -186,10 +186,10 @@
[Запустить регулярное выражение](https://regex101.com/r/7m8me5/1) [Запустить регулярное выражение](https://regex101.com/r/7m8me5/1)
Символы можно комбинировать, так, например, символ `*` может использоваться с метасимволом `.` Символы можно комбинировать, так, например, символ `*` может использоваться с метасимволом `.`
для поиска одной строки с произвольным содержанием `. * `. Символ `*` может использоваться для поиска одной строки с произвольным содержанием `.*`. Символ `*` может использоваться
с символом пробела `\ s`, чтобы находить строки с символами пробела. Например, выражение с символом пробела `\s`, чтобы находить строки с символами пробела. Например, выражение
`\ s * cat \ s *` означает: ноль или более пробелов, за которыми следует слово `cat`, `\s*cat\s*` означает: ноль или более пробелов, за которыми следует слово `cat`,
за которым следует ноль или более символов пробела. за которым следует ноль или более символов пробела.
<pre> <pre>
@ -200,9 +200,9 @@
### 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>.
@ -212,9 +212,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.
@ -230,9 +230,9 @@
## 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.
@ -240,9 +240,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.
@ -260,11 +260,11 @@
Скобочные группы это группы подшаблонов, которые написаны в круглых скобках Скобочные группы это группы подшаблонов, которые написаны в круглых скобках
`(...)`. Как мы уже говорили ранее в регулярном выражении, если мы поставим квантификатор `(...)`. Как мы уже говорили ранее в регулярном выражении, если мы поставим квантификатор
после символа, он будет повторять предыдущий символ. Но если мы поставим квантификатор после после символа, он будет повторять предыдущий символ. Но если мы поставим квантификатор после
скобочной группы, он будет искать всю группу. Например, регулярное выражение `(ab) *` соответствует скобочной группы, он будет искать всю группу. Например, регулярное выражение `(ab)*` соответствует
нулю или более повторений символа "ab". Мы также можем использовать метасимвол чередования `|` нулю или более повторений символа "ab". Мы также можем использовать метасимвол чередования `|`
внутри скобочной группы. Например, регулярное выражение `(c|g|p)ar` означает поиск одной из строчных букв `c`, внутри скобочной группы. Например, регулярное выражение `(c|g|p)ar` означает поиск одной из строчных букв `c`,
`g` или `p`, за которыми следуют буквы 'a' и 'r'. `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.
@ -272,15 +272,15 @@
[Запустить регулярное выражение](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.
@ -289,16 +289,16 @@
[Запустить регулярное выражение](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` объединяет два шаблона (заглавная `T` ИЛИ строчная `t`, с продолжением из `h` и `e`) и шаблон
(строчная `c`, затем строчная `a`, за которой следует строчная `r`). Таким образом, в поиске будет участвовать любой из данных шаблонов, (строчная `c`, затем строчная `a`, за которой следует строчная `r`). Таким образом, в поиске будет участвовать любой из данных шаблонов,
по аналогии с логической операцией ИЛИ в программировании и алгебре выражений. по аналогии с логической операцией ИЛИ в программировании и алгебре выражений.
@ -310,13 +310,13 @@
## 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>
@ -326,19 +326,19 @@
## 2.8 Якоря ## 2.8 Якоря
Понятие якорей в регулярных выражениях используется для обозначения проверок, является ли Понятие якорей в регулярных выражениях используется для обозначения проверок, является ли
соответствующий символ начальным или конечным символом входной строки. Якоря бывают двух типов: соответствующий символ начальным или конечным символом входной строки. Якоря бывают двух типов:
Первый тип - Каретка `^`, проверяет, является ли соответствующий символ начальным символом в тексте. Первый тип - Каретка `^`, проверяет, является ли соответствующий символ начальным символом в тексте.
Второй тип - Доллар `$`, проверяет, является ли соответствующий символ последним символом входной строки. Второй тип - Доллар `$`, проверяет, является ли соответствующий символ последним символом входной строки.
### 2.8.1 Каретка ### 2.8.1 Каретка
Символ каретки `^` используется для проверки, является ли соответствующий символ первым символом входной строки. Символ каретки `^` используется для проверки, является ли соответствующий символ первым символом входной строки.
Если мы применяем следующее регулярное выражение `^a` (если a является начальным символом) для строки `abc`, Если мы применяем следующее регулярное выражение `^a` (если a является начальным символом) для строки `abc`,
совпадение будет соответствовать букве `a`. Если же мы используем регулярное выражение `^b` на той же строке, совпадение будет соответствовать букве `a`. Если же мы используем регулярное выражение `^b` на той же строке,
мы не получим совпадения, поскольку во входящей строке `abc` "b" не является первым символом. Рассмотрим другое мы не получим совпадения, поскольку во входящей строке `abc` "b" не является первым символом. Рассмотрим другое
регулярное выражение: `^(T|t)he`, обозначающее заглавную `T` или строчную `t` как первый символ, за которым следуют регулярное выражение: `^(T|t)he`, обозначающее заглавную `T` или строчную `t` как первый символ, за которым следуют
символы букв 'h' и 'e'. Cоответственно: символы букв `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.
@ -371,10 +371,10 @@
[Запустить регулярное выражение](https://regex101.com/r/t0AkOd/1) [Запустить регулярное выражение](https://regex101.com/r/t0AkOd/1)
## 3. Наборы сокращений и диапазоны ## 3. Наборы сокращений и диапазоны
Регулярные выражения предоставляют сокращения для часто используемых наборов символов, Регулярные выражения предоставляют сокращения для часто используемых наборов символов,
которые предлагают удобные сокращения для часто используемых регулярных выражений. которые предлагают удобные сокращения для часто используемых регулярных выражений.
Наборы сокращенных символов следующие: Наборы сокращенных символов следующие:
|Сокращение|Описание| |Сокращение|Описание|
@ -389,12 +389,12 @@
## 4. Опережающие и ретроспективные проверки ## 4. Опережающие и ретроспективные проверки
Опережающие и ретроспективные проверки (в английской литературе lookbehind, lookahead) это особый вид Опережающие и ретроспективные проверки (в английской литературе lookbehind, lookahead) это особый вид
***не запоминающих скобочных групп*** (находящих совпадения, но не добавляющих в массив). ***не запоминающих скобочных групп*** (находящих совпадения, но не добавляющих в массив).
Данные проверки используются, мы знаем, что шаблон предшествует или сопровождается другим шаблоном. Данные проверки используются, мы знаем, что шаблон предшествует или сопровождается другим шаблоном.
Например, мы хотим получить получить цену в долларах `$`, из следующей входной строки Например, мы хотим получить получить цену в долларах `$`, из следующей входной строки
`$4.44 and $10.88`. Для этого используем следующее регулярное выражение `(?<=\$)[0-9\.]*`, означающее `$4.44 and $10.88`. Для этого используем следующее регулярное выражение `(?<=\$)[0-9\.]*`, означающее
получение всех дробных (с точкой `.`) цифр, которым предшествует знак доллара `$`. Существуют получение всех дробных (с точкой `.`) цифр, которым предшествует знак доллара `$`. Существуют
следующие виды проверок: следующие виды проверок:
|Символ|Описание| |Символ|Описание|
@ -407,11 +407,11 @@
### 4.1 Положительное опережающее условие ### 4.1 Положительное опережающее условие
Положительное опережающее утверждение (assert) означает, что за первой частью выражения должно следовать Положительное опережающее утверждение (assert) означает, что за первой частью выражения должно следовать
опережающее выражение (lookahead expression). (по аналогии с условиями, if (..) then (..)). опережающее выражение (lookahead expression). (по аналогии с условиями, if (..) then (..)).
Возвращенное совпадение содержит только текст, который соответствует первой части выражения. Возвращенное совпадение содержит только текст, который соответствует первой части выражения.
Для определения положительного опережающего условия используются круглые скобки. В этих скобках используется Для определения положительного опережающего условия используются круглые скобки. В этих скобках используется
знак вопроса со знаком равенства: `(?=...)`. Опережающее выражение, записывается в скобках после знака равенства. знак вопроса со знаком равенства: `(?=...)`. Опережающее выражение, записывается в скобках после знака равенства.
Рассмотрим пример регулярного выражения: `(T|t)he(?=\sfat)`, обозначающее опциональное наличие строчной `t` или заглавной `T`, Рассмотрим пример регулярного выражения: `(T|t)he(?=\sfat)`, обозначающее опциональное наличие строчной `t` или заглавной `T`,
следом буквы `h` и `e`. В скобках, мы определяем положительное опережающее условие, которое сообщает движку регулярных выражений следом буквы `h` и `e`. В скобках, мы определяем положительное опережающее условие, которое сообщает движку регулярных выражений
информацию о том, что после шаблона `The` или `the` будет следовать слово `fat`. информацию о том, что после шаблона `The` или `the` будет следовать слово `fat`.
@ -423,7 +423,7 @@
### 4.2 Отрицательное опережающее условие ### 4.2 Отрицательное опережающее условие
Отрицательное опережающее условие работает по обратному принципу: используется, когда нам нужно получить Отрицательное опережающее условие работает по обратному принципу: используется, когда нам нужно получить
все совпадения из входной строки, за которыми НЕ следует определенный шаблон. Отрицательное опережающее условие все совпадения из входной строки, за которыми НЕ следует определенный шаблон. Отрицательное опережающее условие
определяется таким же образом, как и позитивное, с той лишь разницей, что вместо равенства `=` мы ставим определяется таким же образом, как и позитивное, с той лишь разницей, что вместо равенства `=` мы ставим
восклицательный знак `!` (отрицание) например: `(?!...)`. Рассмотрим выражение `(T|t)he(?!\sfat)`, в котором мы восклицательный знак `!` (отрицание) например: `(?!...)`. Рассмотрим выражение `(T|t)he(?!\sfat)`, в котором мы
@ -438,8 +438,8 @@
### 4.3 Положительное ретроспективное условие ### 4.3 Положительное ретроспективное условие
Положительное ретроспективное условие используется чтобы найти все совпадения, которым предшествует Положительное ретроспективное условие используется чтобы найти все совпадения, которым предшествует
определенный шаблон. Условие определяется как `(?<=...)`. Например, выражение `(?<=(T|t)he\s)(fat|mat)` означает, определенный шаблон. Условие определяется как `(?<=...)`. Например, выражение `(?<=(T|t)he\s)(fat|mat)` означает,
найти все слова `fat` или `mat` из входной строки, которым предшествует слово `The` or `the`. найти все слова `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>.
@ -461,7 +461,7 @@
## 5. Флаги ## 5. Флаги
Флаги, также называемые модификаторами, изменяют вывод регулярного выражения. Флаги, также называемые модификаторами, изменяют вывод регулярного выражения.
Эти флаги могут быть использованы в любом порядке или комбинации, и являются Эти флаги могут быть использованы в любом порядке или комбинации, и являются
неотъемлемой частью регулярных выражений. неотъемлемой частью регулярных выражений.
@ -474,8 +474,8 @@
### 5.1 Поиск без учета регистра ### 5.1 Поиск без учета регистра
Модификатор `i` используется для поиска без учета регистра. Например, регулярное выражение Модификатор `i` используется для поиска без учета регистра. Например, регулярное выражение
`/The/gi` означает заглавную `T` следом строчные `h` и `e`. В конце регулярного выражения флаг `i`, `/The/gi` означает заглавную `T` следом строчные `h` и `e`. В конце регулярного выражения флаг `i`,
указывающий движку регулярных выражений игнорировать регистр. Помимо `i`, для поиска шаблона во указывающий движку регулярных выражений игнорировать регистр. Помимо `i`, для поиска шаблона во
всем входном тексте, использован флаг `g`. всем входном тексте, использован флаг `g`.
<pre> <pre>
@ -493,8 +493,8 @@
### 5.2 Глобальный поиск ### 5.2 Глобальный поиск
Модификатор `g` используется для выполнения глобального сопоставления (найти все совпадения, а не останавливаться после первого). Модификатор `g` используется для выполнения глобального сопоставления (найти все совпадения, а не останавливаться после первого).
Например, регулярное выражение `/.(at)/g` означает любой символ кроме символа новой строки, следом строчная `a`, далее строчная `t`. Например, регулярное выражение `/.(at)/g` означает любой символ кроме символа новой строки, следом строчная `a`, далее строчная `t`.
Из-за использования флага `g` в конце регулярного выражения, теперь оно найдет все совпадения во входной строке, а не остановится на первом Из-за использования флага `g` в конце регулярного выражения, теперь оно найдет все совпадения во входной строке, а не остановится на первом
(что является поведением по умолчанию). (что является поведением по умолчанию).
<pre> <pre>
@ -513,9 +513,9 @@
Модификатор `m` используется для многострочного поиска. Как мы обсуждали ранее, Модификатор `m` используется для многострочного поиска. Как мы обсуждали ранее,
якоря `(^, $)` используются для проверки, является ли шаблон началом или концом входной строки. якоря `(^, $)` используются для проверки, является ли шаблон началом или концом входной строки.
Но если мы хотим, чтобы якоря работали в каждой строке, мы используем флаг `m`. Например, Но если мы хотим, чтобы якоря работали в каждой строке, мы используем флаг `m`. Например,
регулярное выражение `/at(.)?$/gm` означает строчную `a`, следом строчная `t` и любой регулярное выражение `/at(.)?$/gm` означает строчную `a`, следом строчная `t` и любой
символ кроме начала новой строки, идущий опционально (не обязательно). Из-за флага `m` механизм символ кроме начала новой строки, идущий опционально (не обязательно). Из-за флага `m` механизм
регулярных выражений будет искать данный шаблон в конце каждой строки в тексте. регулярных выражений будет искать данный шаблон в конце каждой строки в тексте.
<pre> <pre>
@ -535,7 +535,7 @@
[Запустить регулярное выражение](https://regex101.com/r/E88WE2/1) [Запустить регулярное выражение](https://regex101.com/r/E88WE2/1)
## 6. Жадные vs ленивые квантификаторы ## 6. Жадные vs ленивые квантификаторы
По умолчанию регулярное выражение выполняет жадное сопоставление, то есть оно будет По умолчанию регулярное выражение выполняет жадное сопоставление, то есть оно будет
искать совпадения как можно дольше. Мы можем использовать `?` для ленивого поиска, который искать совпадения как можно дольше. Мы можем использовать `?` для ленивого поиска, который
будет стремиться быть как можно более коротким по времени. будет стремиться быть как можно более коротким по времени.