You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 10-regular-expressions-javascript/10-regexp-backreferences/article.md
+12-8Lines changed: 12 additions & 8 deletions
Original file line number
Diff line number
Diff line change
@@ -5,18 +5,22 @@
5
5
На скобочные группы можно ссылаться как в самом паттерне, так и в строке замены.
6
6
[cut]
7
7
8
-
## Группа в замене
8
+
## Группа в строке замены
9
9
10
-
Ссылки в строке замены имеют вид `$n`, где `n` -- это номер скобочной группы. Вместо `$n` подставляется содержимое соответствующей скобки:
10
+
Ссылки в строке замены имеют вид `$n`, где `n` -- это номер скобочной группы.
11
+
12
+
Вместо `$n` подставляется содержимое соответствующей скобки:
11
13
12
14
```js
13
15
//+ run
14
16
var name ="Александр Пушкин";
15
17
16
-
name =name.replace(/([а-яё]+) ([а-яё]+)/i, "$2, $1");
18
+
name =name.replace(/([а-яё]+) ([а-яё]+)/i, *!*"$2, $1"*/!*);
17
19
alert( name ); // Пушкин, Александр
18
20
```
19
21
22
+
В примере выше вместо <codeclass="pattern">$2</code> подставляется второе найденное слово, а вместо <codeclass="pattern">$1</code> -- первое.
23
+
20
24
## Группа в шаблоне
21
25
22
26
Выше был пример использования содержимого групп в строке замены. Это удобно, когда нужно реорганизовать содержимое или создать новое с использованием старого.
@@ -27,11 +31,11 @@ alert( name ); // Пушкин, Александр
27
31
28
32
Как такие строки искать?
29
33
30
-
Можно в регэкспе предусмотреть произвольные кавычки: <codeclass="pattern">`['"](.*?)['"]`</code>. Такой регэксп найдёт строки вида <codeclass="match">"..."</code>, <codeclass="match">'...'</code>, но он даст неверный ответ в случае, если одна кавычка ненароком оказалась внутри другой, как например в строке <codeclass="subject">"She's the one"</code>:
34
+
Можно в регэкспе предусмотреть произвольные кавычки: <codeclass="pattern">`['"](.*?)['"]`</code>. Такой регэксп найдёт строки вида <codeclass="match">"..."</code>, <codeclass="match">'...'</code>, но он даст неверный ответ в случае, если одна кавычка ненароком оказалась внутри другой, как например в строке <codeclass="subject">"She's the one!"</code>:
Теперь работает верно! Движок регулярных выражений, найдя первое скобочное выражение -- кавычку <codeclass="pattern">(['"])</code>, запоминает его и далее <codeclass="pattern">\1</code> означает "найти то же самое, что в первой скобочной группе".
Чтобы регэксп находил одновременно <codeclass="match">gr<b>a</b>y</code> и <codeclass="match">gr<b>e</b>y</code>, можно использовать <codeclass="pattern">gr(a|e)y</code> или <codeclass="pattern">gr[ae]y</code>, но не <codeclass="pattern">gra|ey</code>. Последний регэксп применит альтернацию к подвыражениям: <codeclass="pattern">gra</code> (ИЛИ) <codeclass="pattern">ey</code>.
23
-
24
-
22
+
Мы уже знаем похожую вещь -- квадратные скобки. Они позволяют выбирать между символами, например <codeclass="pattern">gr[ae]y</code> найдёт <codeclass="match">gray</code>, либо <codeclass="match">grey</code>.
25
23
24
+
Альтернация работает уже не посимвольно, а на уровне фраз и подвыражений. Регэксп <codeclass="pattern">A|B|C</code> обозначает поиск одного из выражений: `A`, `B` или `C`, причём в качестве выражений могут быть другие, сколь угодно сложные регэкспы.
26
25
26
+
Для указания границ альтернации используют скобки `(...)`, например: <codeclass="pattern">before(XXX|YYY)after</code> будет искать <codeclass="match">beforeXXXafter</code> или <codeclass="match">beforeYYYafter</code>.
Copy file name to clipboardExpand all lines: 10-regular-expressions-javascript/13-regexp-ahchors-and-multiline-mode/article.md
+19-13Lines changed: 19 additions & 13 deletions
Original file line number
Diff line number
Diff line change
@@ -5,51 +5,55 @@
5
5
6
6
Каретка <codeclass="pattern">^</code> совпадает в начале текста, а доллар <codeclass="pattern">$</code> -- в конце.
7
7
8
-
**Якоря являются не символами, а проверками. Они совпадают на "позиции".**
8
+
**Якоря являются не символами, а проверками.**
9
9
10
-
Это очень важное отличие по сравнению с символьными классами. Если движок регулярных выражений видит <codeclass="pattern">^</code> -- он *проверяет* начало текста, <codeclass="pattern">$</code> -- проверяет конец текста, при этом *никаких символов к совпадению не добавляется*.
10
+
До этого мы говорили о регулярных выражениях, которые ищут один или несколько символов. Если совпадение есть -- эти символы включаются в результат.
11
+
12
+
А якоря -- не такие. Когда поиск ходит до якоря -- он проверяет, есть ли соответствие, если есть -- продолжает идти по шаблону, не прибавляя ничего к результату.
11
13
12
14
Каретку <codeclass="pattern">^</code> обычно используют, чтобы указать, что регулярное выражение необходимо проверить именно с начала текста.
0 commit comments