renovations

This commit is contained in:
Ilya Kantor 2015-03-23 10:49:30 +03:00
parent c6803faefd
commit 3889056599
22 changed files with 267 additions and 10 deletions

View file

@ -1,11 +1,6 @@
# Совпадение для /d+? d+/
Мы разобрали совпадение:
```js
"123 456".match(/\d+ \d+?/g) ); // 123 4
```
А что будет, если сначала поставить ленивый, а потом жадный квантификаторы?
Что будет при таком поиске, когда сначало стоит ленивый, а потом жадный квантификаторы?
```js
"123 456".match(/\d+? \d+/g) ); // какой результат?

View file

@ -0,0 +1,16 @@
Они очень похожи и, да, *почти* одинаковы. Оба ищут от одной кавычки до другой.
Различие здесь в символе точка <code class="pattern">'.'</code>. Как мы помним, точка <code class="pattern">'.'</code> обозначает *любой символ, кроме перевода строки*.
А <code class="pattern">[^"]</code> -- это *любой символ, кроме кавычки <code class="pattern">'"'</code>.
Получатся, что первый регэксп <code class="pattern">"[^"]*"</code> найдёт закавыченные строки с `\n` внутри, а второй регэксп <code class="pattern">".*?"</code> -- нет.
Вот пример:
```js
//+ run
alert( '"многострочный \n текст"'.match(/"[^"]*"/) ); // найдёт
alert( '"многострочный \n текст"'.match(/".*?"/) ); // null (нет совпадений)
```

View file

@ -0,0 +1,5 @@
# Различие между "[^"]*" и ".*?"
Регулярные выражения <code class="pattern">"[^"]*"</code> и <code class="pattern">".*?"</code> -- при выполнении одинаковы?
Иначе говоря, существует ли такая строка, на которой они дадут разные результаты? Если да -- дайте такую строку.

View file

@ -0,0 +1,18 @@
Нужно найти начало комментария <code class="match">&lt;!--</code>, затем всё до конца <code class="match">--&gt;</code>.
С первого взгляда кажется, что это сделает регулярное выражение <code class="pattern">&lt;!--.*?--&gt;</code> -- квантификатор сделан ленивым, чтобы остановился, достигнув <code class="match">--&gt;</code>.
Однако, точка в JavaScript -- любой символ, *кроме* конца строки. Поэтому такой регэксп не найдёт многострочный комментарий.
Всё получится, если вместо точки использовать полностю "всеядный" <code class="pattern">[\s\S]</code>.
Итого:
```js
//+ run
var re = /<!--[\s\S]*?-->/g;
var str = '.. <!-- Мой -- комментарий \n тест --> .. <!----> .. ';
alert( str.match(re) ); // '<!-- Мой -- комментарий \n тест -->', '<!---->'
```

View file

@ -0,0 +1,11 @@
# Найти HTML-комментарии
Найдите все HTML-комментарии в тексте:
```js
var re = ..ваш регэксп..
var str = '.. <!-- Мой -- комментарий \n тест --> .. <!----> .. ';
alert( str.match(re) ); // '<!-- Мой -- комментарий \n тест -->', '<!---->'
```

View file

@ -0,0 +1,38 @@
Начнём поиск с <code class="pattern">&lt;</code>, затем один или более произвольный символ, но до закрывающего "уголка": <code class="pattern">.+?&gt;</code>.
Проверим, как работает этот регэксп:
```js
//+ run
var re = /<.+?>/g;
var str = '<> <a href="/"> <input type="radio" checked> <b>';
alert( str.match(re) ); // <> <a href="/">, <input type="radio" checked>, <b>
```
Результат неверен! В качестве первого тега регэксп нашёл подстроку <code class="match">&lt;&gt; &lt;a href="/"&gt;</code>, но это явно не тег.
Всё потому, что <code class="pattern">.+?</code> -- это "любой символ (кроме `\n`), повторяющийся один и более раз до того, как оставшаяся часть шаблона совпадёт (ленивость)".
Поэтому он находит первый `<`, затем есть "всё подряд" до следующего `>`.
Первое совпадение получается как раз таким:
```
<.............>
<> <a href="/"> <input type="radio" checked> <b>
```
Правильным решением будет использовать <code class="pattern">&lt;[^&gt;]+&gt;</code>:
```js
//+ run
var re = /<[^>]+>/g
var str = '<> <a href="/"> <input type="radio" checked> <b>';
alert( str.match(re) ); // <a href="/">, <input type="radio" checked>, <b>
```
Это же решение автоматически позволяет находится внутри тегу символу `\n`, который в класс точка `.` не входит.

View file

@ -0,0 +1,18 @@
# Найти HTML-теги
Создайте регулярное выражение для поиска всех (открывающихся и закрывающихся) HTML-тегов вместе с атрибутами.
Пример использования:
```js
//+ run
var re = /* ваш регэксп */
var str = '<> <a href="/"> <input type="radio" checked> <b>';
alert( str.match(re) ); // '<a href="/">', '<input type="radio" checked>', '<b>'
```
В этой задаче можно считать, что тег начинается с <code>&lt;</code>, заканчивается <code>&gt;</code> и может содержать внутри любые символы, кроме <code>&lt;</code> и <code>&gt;</code>.
Но хотя бы один символ внутри тега должен быть: <code>&lt;&gt;</code> -- не тег.