Skip to content

Commit f6f6b20

Browse files
committed
renovate regexps
1 parent 9122b13 commit f6f6b20

File tree

17 files changed

+397
-138
lines changed

17 files changed

+397
-138
lines changed

10-regular-expressions-javascript/10-regexp-backreferences/article.md

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,22 @@
55
На скобочные группы можно ссылаться как в самом паттерне, так и в строке замены.
66
[cut]
77

8-
## Группа в замене
8+
## Группа в строке замены
99

10-
Ссылки в строке замены имеют вид `$n`, где `n` -- это номер скобочной группы. Вместо `$n` подставляется содержимое соответствующей скобки:
10+
Ссылки в строке замены имеют вид `$n`, где `n` -- это номер скобочной группы.
11+
12+
Вместо `$n` подставляется содержимое соответствующей скобки:
1113

1214
```js
1315
//+ run
1416
var name = "Александр Пушкин";
1517

16-
name = name.replace(/([а-яё]+) ([а-яё]+)/i, "$2, $1");
18+
name = name.replace(/([а-яё]+) ([а-яё]+)/i, *!*"$2, $1"*/!*);
1719
alert( name ); // Пушкин, Александр
1820
```
1921

22+
В примере выше вместо <code class="pattern">$2</code> подставляется второе найденное слово, а вместо <code class="pattern">$1</code> -- первое.
23+
2024
## Группа в шаблоне
2125

2226
Выше был пример использования содержимого групп в строке замены. Это удобно, когда нужно реорганизовать содержимое или создать новое с использованием старого.
@@ -27,11 +31,11 @@ alert( name ); // Пушкин, Александр
2731

2832
Как такие строки искать?
2933

30-
Можно в регэкспе предусмотреть произвольные кавычки: <code class="pattern">`['"](.*?)['"]`</code>. Такой регэксп найдёт строки вида <code class="match">"..."</code>, <code class="match">'...'</code>, но он даст неверный ответ в случае, если одна кавычка ненароком оказалась внутри другой, как например в строке <code class="subject">"She's the one"</code>:
34+
Можно в регэкспе предусмотреть произвольные кавычки: <code class="pattern">`['"](.*?)['"]`</code>. Такой регэксп найдёт строки вида <code class="match">"..."</code>, <code class="match">'...'</code>, но он даст неверный ответ в случае, если одна кавычка ненароком оказалась внутри другой, как например в строке <code class="subject">"She's the one!"</code>:
3135

3236
```js
3337
//+ run
34-
str = "He said:\"She's the one\".";
38+
str = "He said: \"She's the one!\".";
3539

3640
reg = /['"](.*?)['"]/g;
3741

@@ -45,14 +49,14 @@ alert( str.match(reg) ); // "She'
4549

4650
```js
4751
//+ run
48-
str = "He said:\"She's the one\".";
52+
str = "He said: \"She's the one!\".";
4953

5054
reg = /(['"])(.*?)\1/g;
5155

52-
alert( str.match(reg) ); // "She's the one"
56+
alert( str.match(reg) ); // "She's the one!"
5357
```
5458

55-
Теперь работает верно!
59+
Теперь работает верно! Движок регулярных выражений, найдя первое скобочное выражение -- кавычку <code class="pattern">(['"])</code>, запоминает его и далее <code class="pattern">\1</code> означает "найти то же самое, что в первой скобочной группе".
5660

5761
Обратим внимание на два нюанса:
5862

10-regular-expressions-javascript/11-regexp-infinite-backtracking-problem/article.md

Lines changed: 0 additions & 82 deletions
This file was deleted.

10-regular-expressions-javascript/12-regexp-alternation/article.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,21 @@
66

77
Например, нам нужно найти языки программирования: HTML, PHP, Java и JavaScript.
88

9-
Соответствующее регулярное выражение: <code class="pattern">/html|php/java(script)?/</code>:
9+
Соответствующее регулярное выражение: <code class="pattern">html|php|java(script)?</code>.
10+
11+
Пример использования:
1012

1113
```js
1214
//+ run
1315
var reg = /html|php|css|java(script)?/gi
1416

1517
var str = "Сначала появился HTML, затем CSS, потом JavaScript"
1618

17-
alert(str.match(reg)) // 'HTML', 'CSS', 'JavaScript'
19+
alert( str.match(reg) ) // 'HTML', 'CSS', 'JavaScript'
1820
```
1921

20-
**Альтернация имеет очень низкий приоритет.**
21-
22-
Чтобы регэксп находил одновременно <code class="match">gr<b>a</b>y</code> и <code class="match">gr<b>e</b>y</code>, можно использовать <code class="pattern">gr(a|e)y</code> или <code class="pattern">gr[ae]y</code>, но не <code class="pattern">gra|ey</code>. Последний регэксп применит альтернацию к подвыражениям: <code class="pattern">gra</code> (ИЛИ) <code class="pattern">ey</code>.
23-
24-
22+
Мы уже знаем похожую вещь -- квадратные скобки. Они позволяют выбирать между символами, например <code class="pattern">gr[ae]y</code> найдёт <code class="match">gray</code>, либо <code class="match">grey</code>.
2523

24+
Альтернация работает уже не посимвольно, а на уровне фраз и подвыражений. Регэксп <code class="pattern">A|B|C</code> обозначает поиск одного из выражений: `A`, `B` или `C`, причём в качестве выражений могут быть другие, сколь угодно сложные регэкспы.
2625

26+
Для указания границ альтернации используют скобки `(...)`, например: <code class="pattern">before(XXX|YYY)after</code> будет искать <code class="match">beforeXXXafter</code> или <code class="match">beforeYYYafter</code>.

10-regular-expressions-javascript/13-regexp-ahchors-and-multiline-mode/article.md

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,51 +5,55 @@
55

66
Каретка <code class="pattern">^</code> совпадает в начале текста, а доллар <code class="pattern">$</code> -- в конце.
77

8-
**Якоря являются не символами, а проверками. Они совпадают на "позиции".**
8+
**Якоря являются не символами, а проверками.**
99

10-
Это очень важное отличие по сравнению с символьными классами. Если движок регулярных выражений видит <code class="pattern">^</code> -- он *проверяет* начало текста, <code class="pattern">$</code> -- проверяет конец текста, при этом *никаких символов к совпадению не добавляется*.
10+
До этого мы говорили о регулярных выражениях, которые ищут один или несколько символов. Если совпадение есть -- эти символы включаются в результат.
11+
12+
А якоря -- не такие. Когда поиск ходит до якоря -- он проверяет, есть ли соответствие, если есть -- продолжает идти по шаблону, не прибавляя ничего к результату.
1113

1214
Каретку <code class="pattern">^</code> обычно используют, чтобы указать, что регулярное выражение необходимо проверить именно с начала текста.
1315

14-
Например, без каретки:
16+
Например, без каретки найдёт все числа:
1517

1618
```js
1719
//+ run
1820
var str = '100500 попугаев съели 500100 бананов!';
19-
alert(str.match(/\d+/ig) // 100500, 500100 (все числа)
21+
alert( str.match(/\d+/ig) ); // 100500, 500100 (нашло все числа)
2022
```
2123

22-
А с кареткой:
24+
А с кареткой -- только первое:
2325

2426
```js
2527
//+ run
2628
var str = '100500 попугаев съели 500100 бананов!';
27-
alert(str.match(/^\d+/ig) // 100500 (только в начале строки)*!*
29+
alert( str.match(/^\d+/ig) ); // 100500 (только в начале строки)*!*
2830
```
2931

3032
Знак доллара <code class="pattern">$</code> используют, чтобы указать, что паттерн должен заканчиваться в конце текста.
3133

32-
Тот же пример с долларом:
34+
Аналогичный пример с долларом для поиска числа в конце:
3335

3436
```js
3537
//+ run
36-
var str = '100500 попугаев съели 500100 бананов!';
37-
alert(str.match(/\d+$/ig) // null (в начале строки чисел нет)*!*
38+
var str = '100500 попугаев съели 500100';
39+
alert( str.match(/\d+$/ig) ); // 500100
3840
```
3941

40-
Якоря используют одновременно, чтобы указать, что паттерн должен охватывать текст с начала и до конца. Обычно это требуется при валидации.
42+
Оба якоря используют одновременно, если требуется, чтобы шаблон охватывал текст с начала и до конца. Обычно это требуется при валидации.
4143

42-
Например, мы хотим проверить, что в переменной `num` хранится именно десятичная дробь.
44+
Например, мы хотим проверить, что в переменной `num` хранится именно десятичная дробь.
4345

44-
Ей соответствует регэксп <code class="pattern">\d+\.\d+</code>. Но простая проверка найдёт дробь в любом тексте:
46+
Ей соответствует регэксп <code class="pattern">\d+\.\d+</code>. Но простой поиск найдёт дробь в любом тексте:
4547

4648
```js
4749
//+ run
4850
var num = "ля-ля 12.34";
4951
alert( num.match(/\d+\.\d+/ig) ); // 12.34
5052
```
5153

52-
Если мы хотим проверить, что `num` *целиком* соответствует паттерну <code class="pattern">\d+\.\d+</code>, то укажем якоря по обе стороны от него:
54+
Наша же задача -- проверить, что `num` *целиком* соответствует паттерну <code class="pattern">\d+\.\d+</code>.
55+
56+
Для этого обернём шаблон в якоря <code class="pattern">^...$</code>:
5357

5458
```js
5559
//+ run
@@ -60,3 +64,5 @@ var num = "12.34";
6064
alert( num.match(/^\d+\.\d+$/ig) ); // 12.34, дробь!
6165
```
6266

67+
Теперь поиск ищет начало текста, за которым идёт число, затем точка, ещё число и конец текста. Это как раз то, что нужно.
68+

0 commit comments

Comments
 (0)