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

@ -38,7 +38,7 @@
Регулярные выражения используются для замен текста внутри строк, валидации форм,
извлечений подстрок по определенным шаблонам и множества других вещей.
Представьте, что вы пишете приложение и хотите установить правила, по которым пользователь выбирает свой юзернейм. Мы хотим, чтобы имя пользователя содержало буквы, цифры, подчеркивания и дефисы. Мы также хотим ограничить количество символов в имени пользователя, чтобы оно не выглядело безобразно.
Представьте, что вы пишете приложение и хотите установить правила, по которым пользователь выбирает свой юзернейм. Мы хотим, чтобы имя пользователя содержало буквы, цифры, подчеркивания и дефисы. Мы также хотим ограничить количество символов в имени пользователя, чтобы оно не выглядело безобразно.
Для этого, используем следующее регулярное выражение:
@ -47,7 +47,7 @@
<img src="../img/regexp-ru.png" alt="Regular expression">
</p>
Регулярное выражения выше может принимать строки `john_doe`,` jo-hn_doe` и `john12_as`.
Регулярное выражения выше может принимать строки `john_doe`,`jo-hn_doe` и `john12_as`.
Оно не валидирует `Jo`, поскольку эта строка содержит заглавные буквы, а также она слишком короткая.
## Содержание
@ -83,7 +83,7 @@
## 1. Совпадения.
В сущности, регулярное выражение - это просто набор символов, который мы используем для поиска в тексте.
Например, регулярное выражение `the` состоит из буквы` t`, за которой следует буква `h`, за которой следует буква `e`.
Например, регулярное выражение `the` состоит из буквы `t`, за которой следует буква `h`, за которой следует буква `e`.
<pre>
"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)
Регулярное выражение `123` соответствует строке` 123`. Регулярное выражение сопоставляется с входной строкой, сравнивая
Регулярное выражение `123` соответствует строке `123`. Регулярное выражение сопоставляется с входной строкой, сравнивая
каждый символ в регулярном выражении с каждым символом во входной строке по одному символу за другим. Регулярные выражения
обычно чувствительны к регистру, поэтому регулярное выражение `The` не будет соответствовать строке` the`.
обычно чувствительны к регистру, поэтому регулярное выражение `The` не будет соответствовать строке `the`.
<pre>
"The" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat.
@ -126,7 +126,7 @@
Точка `.` это простейший пример метасимвола. Метасимвол `.`
находит любой отдельный символ. Точка не будет находить символы перехода или перевода строки.
Например, регулярное выражение '.ar' обозначает: любой символ, за которым следуют буквы ` a` и `r`.
Например, регулярное выражение `.ar` обозначает: любой символ, за которым следуют буквы `a` и `r`.
<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.
@ -139,7 +139,7 @@
Набор символов также называется классом символов. Квадратные скобки используются
для определения набора символов. Дефис используется для указания диапазона символов.
Порядок следования символов, заданный в квадратных скобках, не важен. Например,
регулярное выражение `[Tt]he` обозначает заглавную 'T' или строчную 't', за которой следуют буквы 'h' и 'e'.
регулярное выражение `[Tt]he` обозначает заглавную `T` или строчную `t`, за которой следуют буквы `h` и `e`.
<pre>
"[Tt]he" => <a href="#learn-regex"><strong>The</strong></a> car parked in <a href="#learn-regex"><strong>the</strong></a> garage.
@ -148,7 +148,7 @@
[Запустить регулярное выражение](https://regex101.com/r/2ITLQ4/1)
Точка внутри набора символов, однако, обозначает непосредственно точку, как символ.
Регулярное выражение `ar[.]` обозначает строчную 'a', за которой следует 'r', за которой следует '.' (символ точки).
Регулярное выражение `ar[.]` обозначает строчную `a`, за которой следует `r`, за которой следует `.` (символ точки).
<pre>
"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 Отрицание набора символов
Знак вставки '^' обозначает начало строки, однако, когда вы вписываете его после открытия квадратных скобок, он отрицает набор символов.
Например, регулярное выражение `[^c]ar` обозначает любой символ, кроме 'c', за которым следуют буквы 'a' и 'r'.
Знак вставки `^` обозначает начало строки, однако, когда вы вписываете его после открытия квадратных скобок, он отрицает набор символов.
Например, регулярное выражение `[^c]ar` обозначает любой символ, кроме `c`, за которым следуют буквы `a` и `r`.
<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.
@ -169,15 +169,15 @@
## 2.3 Повторения
Символы `+`, `*` or `?` используются для обозначения того, как сколько раз появляется какой-либо подшаблон.
Символы `+`, `*` или `?` используются для обозначения того, как сколько раз появляется какой-либо подшаблон.
Данные метасимволы могут вести себя по-разному, в зависимости от ситуации.
### 2.3.1 Звёздочка
Символ `*` обозначает ноль или более повторений предыдущего совпадения.
Регулярное выражение `a *` означает ноль или более повторений предыдущего
Регулярное выражение `a*` означает ноль или более повторений предыдущего
строчного символа `a`. Если же символ появляется после набора или класса символов,
он находит повторения всего набора символов. Например, регулярное выражение `[a-z] *`
он находит повторения всего набора символов. Например, регулярное выражение `[a-z]*`
означает любое количество строчных букв в строке.
<pre>
@ -187,9 +187,9 @@
[Запустить регулярное выражение](https://regex101.com/r/7m8me5/1)
Символы можно комбинировать, так, например, символ `*` может использоваться с метасимволом `.`
для поиска одной строки с произвольным содержанием `. * `. Символ `*` может использоваться
с символом пробела `\ s`, чтобы находить строки с символами пробела. Например, выражение
`\ s * cat \ s *` означает: ноль или более пробелов, за которыми следует слово `cat`,
для поиска одной строки с произвольным содержанием `.*`. Символ `*` может использоваться
с символом пробела `\s`, чтобы находить строки с символами пробела. Например, выражение
`\s*cat\s*` означает: ноль или более пробелов, за которыми следует слово `cat`,
за которым следует ноль или более символов пробела.
<pre>
@ -202,7 +202,7 @@
Символ `+` соответствует одному или более повторению предыдущего символа. Например,
регулярное выражение `c.+t` означает строчную `c`, за которой следует по крайней мере один символ,
следом за которым идёт символ `t`. Стоит уточнить, что в данном шаблоне, `t` является последним` t` в предложении.
следом за которым идёт символ `t`. Стоит уточнить, что в данном шаблоне, `t` является последним `t` в предложении.
<pre>
"c.+t" => The fat <a href="#learn-regex"><strong>cat sat on the mat</strong></a>.
@ -214,7 +214,7 @@
В регулярном выражении метасимвол `?` делает предыдущий символ необязательным.
Этот символ соответствует нулю или одному экземпляру предыдущего символа.
Например, регулярное выражение `[T]?he` означает необязательную заглавную букву `T`, за которой следуют символы 'h' и 'e'.
Например, регулярное выражение `[T]?he` означает необязательную заглавную букву `T`, за которой следуют символы `h` и `e`.
<pre>
"[T]he" => <a href="#learn-regex"><strong>The</strong></a> car is parked in the garage.
@ -232,7 +232,7 @@
В фигурных скобках, которые также называются квантификаторами, указывается,
сколько раз символ или группа символов могут повторяться. Например, регулярное выражение
`[0-9] {2,3}` означает совпадение не менее 2 но не более 3 цифр в диапазоне от 0 до 9.
`[0-9]{2,3}` означает совпадение не менее 2 но не более 3 цифр в диапазоне от 0 до 9.
<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.
@ -240,9 +240,9 @@
[Запустить регулярное выражение](https://regex101.com/r/juM86s/1)
Уберём второй номер (цифру 3), тогда, регулярное выражение `[0-9] {2,}` будет означать
Уберём второй номер (цифру 3), тогда, регулярное выражение `[0-9]{2,}` будет означать
совпадение 2 или более цифр. Если мы также удалим запятую, то регулярное выражение
`[0-9] {3}` будет означать совпадение точно с 3 цифрами.
`[0-9]{3}` будет означать совпадение точно с 3 цифрами.
<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.
@ -261,10 +261,10 @@
Скобочные группы это группы подшаблонов, которые написаны в круглых скобках
`(...)`. Как мы уже говорили ранее в регулярном выражении, если мы поставим квантификатор
после символа, он будет повторять предыдущий символ. Но если мы поставим квантификатор после
скобочной группы, он будет искать всю группу. Например, регулярное выражение `(ab) *` соответствует
скобочной группы, он будет искать всю группу. Например, регулярное выражение `(ab)*` соответствует
нулю или более повторений символа "ab". Мы также можем использовать метасимвол чередования `|`
внутри скобочной группы. Например, регулярное выражение `(c|g|p)ar` означает поиск одной из строчных букв `c`,
`g` или `p`, за которыми следуют буквы 'a' и 'r'.
`g` или `p`, за которыми следуют буквы `a` и `r`.
<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.
@ -298,7 +298,7 @@
Альтернация по своей сути похожа на оператор ИЛИ между логическими выражениями. Может создаться впечатление, что
чередование это то же самое, что и определение набора символов. Однако, большая разница между ними в том, что
набор символов работает на уровне конкретных символов, в то время как альтернация работает на уровне выражений.
Например, регулярное выражение `(T|t)he|car` объединяет два шаблона (заглавная `T` ИЛИ строчная `t`, с продолжением из 'h' и 'e') и шаблон
Например, регулярное выражение `(T|t)he|car` объединяет два шаблона (заглавная `T` ИЛИ строчная `t`, с продолжением из `h` и `e`) и шаблон
(строчная `c`, затем строчная `a`, за которой следует строчная `r`). Таким образом, в поиске будет участвовать любой из данных шаблонов,
по аналогии с логической операцией ИЛИ в программировании и алгебре выражений.
@ -312,11 +312,11 @@
Обратный слэш `\` используется в регулярных выражениях для экранирования следующего символа.
Это позволяет формировать шаблоны с поиском зарезервированных символов, таких как `{ } [ ] / \ + * . $ ^ | ?`.
Для использования спецсимвола в шаблоне необходимо указать символ '\' перед ним.
Для использования спецсимвола в шаблоне необходимо указать символ `\` перед ним.
Как упомянуто выше, символ `.` является зарезервированным и соответствует любому значению, кроме символа новой строки.
Бывают ситуации, когда необходимо найти точку в предложении, для таких случаев применимо экранирование. Рассмотрим выражение
`(f|c|m)at\.?`, что соответствует следующему шаблону: строчный символ `f`, `c` или `m`, за которым следует строчные буквы `a` и `t`, с опциональной `.` точкой в конце.
`(f|c|m)at\.?`, что соответствует следующему шаблону: строчный символ `f`, `c` или `m`, за которым следует строчные буквы `a` и `t`, с опциональной `.` точкой в конце.
<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>
@ -336,9 +336,9 @@
Символ каретки `^` используется для проверки, является ли соответствующий символ первым символом входной строки.
Если мы применяем следующее регулярное выражение `^a` (если a является начальным символом) для строки `abc`,
совпадение будет соответствовать букве `a`. Если же мы используем регулярное выражение `^b` на той же строке,
мы не получим совпадения, поскольку во входящей строке `abc` "b" не является первым символом. Рассмотрим другое
мы не получим совпадения, поскольку во входящей строке `abc` "b" не является первым символом. Рассмотрим другое
регулярное выражение: `^(T|t)he`, обозначающее заглавную `T` или строчную `t` как первый символ, за которым следуют
символы букв 'h' и 'e'. Cоответственно:
символы букв `h` и `e`. Cоответственно:
<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.
@ -371,7 +371,7 @@
[Запустить регулярное выражение](https://regex101.com/r/t0AkOd/1)
## 3. Наборы сокращений и диапазоны
## 3. Наборы сокращений и диапазоны
Регулярные выражения предоставляют сокращения для часто используемых наборов символов,
которые предлагают удобные сокращения для часто используемых регулярных выражений.
@ -411,7 +411,7 @@
Возвращенное совпадение содержит только текст, который соответствует первой части выражения.
Для определения положительного опережающего условия используются круглые скобки. В этих скобках используется
знак вопроса со знаком равенства: `(?=...)`. Опережающее выражение, записывается в скобках после знака равенства.
Рассмотрим пример регулярного выражения: `(T|t)he(?=\sfat)`, обозначающее опциональное наличие строчной `t` или заглавной `T`,
Рассмотрим пример регулярного выражения: `(T|t)he(?=\sfat)`, обозначающее опциональное наличие строчной `t` или заглавной `T`,
следом буквы `h` и `e`. В скобках, мы определяем положительное опережающее условие, которое сообщает движку регулярных выражений
информацию о том, что после шаблона `The` или `the` будет следовать слово `fat`.
@ -439,7 +439,7 @@
Положительное ретроспективное условие используется чтобы найти все совпадения, которым предшествует
определенный шаблон. Условие определяется как `(?<=...)`. Например, выражение `(?<=(T|t)he\s)(fat|mat)` означает,
найти все слова `fat` или `mat` из входной строки, которым предшествует слово `The` or `the`.
найти все слова `fat` или `mat` из входной строки, которым предшествует слово `The` или `the`.
<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>.
@ -475,7 +475,7 @@
Модификатор `i` используется для поиска без учета регистра. Например, регулярное выражение
`/The/gi` означает заглавную `T` следом строчные `h` и `e`. В конце регулярного выражения флаг `i`,
указывающий движку регулярных выражений игнорировать регистр. Помимо `i`, для поиска шаблона во
указывающий движку регулярных выражений игнорировать регистр. Помимо `i`, для поиска шаблона во
всем входном тексте, использован флаг `g`.
<pre>
@ -513,8 +513,8 @@
Модификатор `m` используется для многострочного поиска. Как мы обсуждали ранее,
якоря `(^, $)` используются для проверки, является ли шаблон началом или концом входной строки.
Но если мы хотим, чтобы якоря работали в каждой строке, мы используем флаг `m`. Например,
регулярное выражение `/at(.)?$/gm` означает строчную `a`, следом строчная `t` и любой
Но если мы хотим, чтобы якоря работали в каждой строке, мы используем флаг `m`. Например,
регулярное выражение `/at(.)?$/gm` означает строчную `a`, следом строчная `t` и любой
символ кроме начала новой строки, идущий опционально (не обязательно). Из-за флага `m` механизм
регулярных выражений будет искать данный шаблон в конце каждой строки в тексте.