From 3889056599a89e29fa97fba69b61715bf5b3a186 Mon Sep 17 00:00:00 2001 From: Ilya Kantor Date: Mon, 23 Mar 2015 10:49:30 +0300 Subject: [PATCH] renovations --- .../3-constructor-new/article.md | 2 +- .../1-find-time-hh-mm/solution.md | 8 ++++ .../1-find-time-hh-mm/task.md | 8 ++++ .../1-find-range-1/solution.md | 18 +++++++++ .../1-find-range-1/task.md | 5 +++ .../2-find-time-2-formats/solution.md | 9 +++++ .../2-find-time-2-formats/task.md | 11 ++++++ .../1-find-text-manydots/solution.md | 6 ++- .../1-find-text-manydots/task.md | 1 - .../2-find-html-colors-6hex/solution.md | 25 ++++++++++++ .../2-find-html-colors-6hex/task.md | 14 +++++++ .../solution.md | 18 +++++++++ .../3-find-decimal-positive-numbers/task.md | 13 +++++++ .../4-find-decimal-numbers/solution.md | 13 +++++++ .../4-find-decimal-numbers/task.md | 13 +++++++ .../1-lazy-greedy/task.md | 7 +--- .../2-difference-find-quote/solution.md | 16 ++++++++ .../2-difference-find-quote/task.md | 5 +++ .../3-find-html-comments/solution.md | 18 +++++++++ .../3-find-html-comments/task.md | 11 ++++++ .../4-find-html-tags-greedy-lazy/solution.md | 38 +++++++++++++++++++ .../4-find-html-tags-greedy-lazy/task.md | 18 +++++++++ 22 files changed, 267 insertions(+), 10 deletions(-) create mode 100644 10-regular-expressions-javascript/3-regexp-character-classes/1-find-time-hh-mm/solution.md create mode 100644 10-regular-expressions-javascript/3-regexp-character-classes/1-find-time-hh-mm/task.md create mode 100644 10-regular-expressions-javascript/5-regexp-character-sets-and-ranges/1-find-range-1/solution.md create mode 100644 10-regular-expressions-javascript/5-regexp-character-sets-and-ranges/1-find-range-1/task.md create mode 100644 10-regular-expressions-javascript/5-regexp-character-sets-and-ranges/2-find-time-2-formats/solution.md create mode 100644 10-regular-expressions-javascript/5-regexp-character-sets-and-ranges/2-find-time-2-formats/task.md create mode 100644 10-regular-expressions-javascript/7-regexp-quantifiers/2-find-html-colors-6hex/solution.md create mode 100644 10-regular-expressions-javascript/7-regexp-quantifiers/2-find-html-colors-6hex/task.md create mode 100644 10-regular-expressions-javascript/7-regexp-quantifiers/3-find-decimal-positive-numbers/solution.md create mode 100644 10-regular-expressions-javascript/7-regexp-quantifiers/3-find-decimal-positive-numbers/task.md create mode 100644 10-regular-expressions-javascript/7-regexp-quantifiers/4-find-decimal-numbers/solution.md create mode 100644 10-regular-expressions-javascript/7-regexp-quantifiers/4-find-decimal-numbers/task.md create mode 100644 10-regular-expressions-javascript/8-regexp-greedy-and-lazy/2-difference-find-quote/solution.md create mode 100644 10-regular-expressions-javascript/8-regexp-greedy-and-lazy/2-difference-find-quote/task.md create mode 100644 10-regular-expressions-javascript/8-regexp-greedy-and-lazy/3-find-html-comments/solution.md create mode 100644 10-regular-expressions-javascript/8-regexp-greedy-and-lazy/3-find-html-comments/task.md create mode 100644 10-regular-expressions-javascript/8-regexp-greedy-and-lazy/4-find-html-tags-greedy-lazy/solution.md create mode 100644 10-regular-expressions-javascript/8-regexp-greedy-and-lazy/4-find-html-tags-greedy-lazy/task.md diff --git a/1-js/6-objects-more/3-constructor-new/article.md b/1-js/6-objects-more/3-constructor-new/article.md index e98feff0..608fc9af 100644 --- a/1-js/6-objects-more/3-constructor-new/article.md +++ b/1-js/6-objects-more/3-constructor-new/article.md @@ -169,7 +169,7 @@ function User(firstName, lastName) { } var vasya = new User("Вася", "Петров"); -vasya.sayHi(); // Вася Петров +vasya.sayHi(); // Привет, Вася Петров ``` Мы уже говорили об этом подходе ранее, в главе [](/closures-usage). diff --git a/10-regular-expressions-javascript/3-regexp-character-classes/1-find-time-hh-mm/solution.md b/10-regular-expressions-javascript/3-regexp-character-classes/1-find-time-hh-mm/solution.md new file mode 100644 index 00000000..1fd6b26a --- /dev/null +++ b/10-regular-expressions-javascript/3-regexp-character-classes/1-find-time-hh-mm/solution.md @@ -0,0 +1,8 @@ + +Ответ: \d\d:\d\d. + +```js +//+ run +alert( "Завтрак в 09:00.".match( /\d\d:\d\d/ ) ); // 09:00 +``` + diff --git a/10-regular-expressions-javascript/3-regexp-character-classes/1-find-time-hh-mm/task.md b/10-regular-expressions-javascript/3-regexp-character-classes/1-find-time-hh-mm/task.md new file mode 100644 index 00000000..f92b52a5 --- /dev/null +++ b/10-regular-expressions-javascript/3-regexp-character-classes/1-find-time-hh-mm/task.md @@ -0,0 +1,8 @@ +# Найдите время + +Время имеет формат `часы:минуты`. И часы и минуты состоят из двух цифр, например: `09:00`. + +Напишите регулярное выражение для поиска времени в строке: Завтрак в 09:00. + +P.S. В этой задаче выражению позволительно найти и некорректное время, например `25:99`. + diff --git a/10-regular-expressions-javascript/5-regexp-character-sets-and-ranges/1-find-range-1/solution.md b/10-regular-expressions-javascript/5-regexp-character-sets-and-ranges/1-find-range-1/solution.md new file mode 100644 index 00000000..6177c8e6 --- /dev/null +++ b/10-regular-expressions-javascript/5-regexp-character-sets-and-ranges/1-find-range-1/solution.md @@ -0,0 +1,18 @@ +Ответы: **нет, да**. + + diff --git a/10-regular-expressions-javascript/5-regexp-character-sets-and-ranges/1-find-range-1/task.md b/10-regular-expressions-javascript/5-regexp-character-sets-and-ranges/1-find-range-1/task.md new file mode 100644 index 00000000..6f0b0e37 --- /dev/null +++ b/10-regular-expressions-javascript/5-regexp-character-sets-and-ranges/1-find-range-1/task.md @@ -0,0 +1,5 @@ +# Java[^script] + +Найдет ли регэксп /Java[^script]/ что-нибудь в строке Java? + +А в строке JavaScript? diff --git a/10-regular-expressions-javascript/5-regexp-character-sets-and-ranges/2-find-time-2-formats/solution.md b/10-regular-expressions-javascript/5-regexp-character-sets-and-ranges/2-find-time-2-formats/solution.md new file mode 100644 index 00000000..969966a2 --- /dev/null +++ b/10-regular-expressions-javascript/5-regexp-character-sets-and-ranges/2-find-time-2-formats/solution.md @@ -0,0 +1,9 @@ +Ответ: \d\d[-:]\d\d. + +```js +//+ run +var re = /\d\d[-:]\d\d/g; +alert( "Завтрак в 09:00. Обед - в 21-30".match(re) ); +``` + +Обратим внимание, что дефис '-' не экранирован, поскольку в начале скобок он не может иметь специального смысла. diff --git a/10-regular-expressions-javascript/5-regexp-character-sets-and-ranges/2-find-time-2-formats/task.md b/10-regular-expressions-javascript/5-regexp-character-sets-and-ranges/2-find-time-2-formats/task.md new file mode 100644 index 00000000..13e0a440 --- /dev/null +++ b/10-regular-expressions-javascript/5-regexp-character-sets-and-ranges/2-find-time-2-formats/task.md @@ -0,0 +1,11 @@ +# Найдите время + +Время может быть в формате `часы:минуты` или `часы-минуты`. И часы и минуты состоят из двух цифр, например `09:00`, `21-30`. + +Напишите регулярное выражение для поиска времени: + +```js +var re = /ваше выражение/; +alert( "Завтрак в 09:00. Обед - в 21-30".match(re) ); // 09:00, 21-30 +``` + diff --git a/10-regular-expressions-javascript/7-regexp-quantifiers/1-find-text-manydots/solution.md b/10-regular-expressions-javascript/7-regexp-quantifiers/1-find-text-manydots/solution.md index 4eb72c42..5108d628 100644 --- a/10-regular-expressions-javascript/7-regexp-quantifiers/1-find-text-manydots/solution.md +++ b/10-regular-expressions-javascript/7-regexp-quantifiers/1-find-text-manydots/solution.md @@ -1,5 +1,5 @@ -Символ `.` является специальным, значит его надо экранировать. -Регулярное выражение: + +Решение: ```js //+ run @@ -7,3 +7,5 @@ var reg = /\.{3,}/g; alert( "Привет!... Как дела?.....".match(reg) ); // ..., ..... ``` +Заметим, что символ `.` является специальным, значит его надо экранировать, то есть вставлять как `\.`. + diff --git a/10-regular-expressions-javascript/7-regexp-quantifiers/1-find-text-manydots/task.md b/10-regular-expressions-javascript/7-regexp-quantifiers/1-find-text-manydots/task.md index 414a49b4..4e94ba20 100644 --- a/10-regular-expressions-javascript/7-regexp-quantifiers/1-find-text-manydots/task.md +++ b/10-regular-expressions-javascript/7-regexp-quantifiers/1-find-text-manydots/task.md @@ -4,7 +4,6 @@ Напишите регулярное выражения для поиска многоточий: трёх или более точек подряд. - Проверьте его: ```js diff --git a/10-regular-expressions-javascript/7-regexp-quantifiers/2-find-html-colors-6hex/solution.md b/10-regular-expressions-javascript/7-regexp-quantifiers/2-find-html-colors-6hex/solution.md new file mode 100644 index 00000000..97cd4508 --- /dev/null +++ b/10-regular-expressions-javascript/7-regexp-quantifiers/2-find-html-colors-6hex/solution.md @@ -0,0 +1,25 @@ +Итак, нужно написать выражение для описания цвета, который начинается с "#", за которым следуют 6 шестнадцатеричных символов. + +Шестнадцатеричный символ можно описать с помощью [0-9a-fA-F]. Мы можем сократить выражение, используя не чувствительный к регистру шаблон [0-9a-f]. + +Для его шестикратного повторения мы будем использовать квантификатор {6}. + +В итоге, получаем выражение вида /#[a-f0-9]{6}/gi. + +```js +//+ run +var re = /#[a-f0-9]{6}/gi; + +var str = "color:#121212; background-color:#AA00ef bad-colors:f#fddee #fd2"; + +alert( str.match(re) ); // #121212,#AA00ef +``` + +Проблема этого выражения в том, что оно находит цвет и в более длинных последовательностях: + +```js +//+ run +alert( "#12345678".match( /#[a-f0-9]{6}/gi ) ) // #12345678 +``` + +Если это является проблемой, то ее можно решить чуть более сложным выражением. diff --git a/10-regular-expressions-javascript/7-regexp-quantifiers/2-find-html-colors-6hex/task.md b/10-regular-expressions-javascript/7-regexp-quantifiers/2-find-html-colors-6hex/task.md new file mode 100644 index 00000000..ea2dbf18 --- /dev/null +++ b/10-regular-expressions-javascript/7-regexp-quantifiers/2-find-html-colors-6hex/task.md @@ -0,0 +1,14 @@ +# Регулярное выражение для цвета + +Напишите регулярное выражение для поиска HTML-цвета, заданного как `#ABCDEF`, то есть `#` и содержит затем 6 шестнадцатеричных символов. + +Пример использования: + +``` +var re = /*...ваше регулярное выражение...*/ + +var str = "color:#121212; background-color:#AA00ef bad-colors:f#fddee #fd2" + +alert( str.match(re) ) // #121212,#AA00ef +``` + diff --git a/10-regular-expressions-javascript/7-regexp-quantifiers/3-find-decimal-positive-numbers/solution.md b/10-regular-expressions-javascript/7-regexp-quantifiers/3-find-decimal-positive-numbers/solution.md new file mode 100644 index 00000000..41f71b50 --- /dev/null +++ b/10-regular-expressions-javascript/7-regexp-quantifiers/3-find-decimal-positive-numbers/solution.md @@ -0,0 +1,18 @@ + + +Целое число -- это \d+. + +Десятичная точка с дробной частью -- \.\d+. + +Она не обязательна, так что обернём её в скобки с квантификатором '?'. + +Итого, получилось регулярное выражение \d+(\.\d+)?: + +```js +//+ run +var re = /\d+(\.\d+)?/g + +var str = "1.5 0 12. 123.4."; + +alert( str.match(re) ); // 1.5, 0, 12, 123.4 +``` diff --git a/10-regular-expressions-javascript/7-regexp-quantifiers/3-find-decimal-positive-numbers/task.md b/10-regular-expressions-javascript/7-regexp-quantifiers/3-find-decimal-positive-numbers/task.md new file mode 100644 index 00000000..17e4d836 --- /dev/null +++ b/10-regular-expressions-javascript/7-regexp-quantifiers/3-find-decimal-positive-numbers/task.md @@ -0,0 +1,13 @@ +# Найдите положительные числа + +Создайте регэксп, который ищет все положительные числа, в том числе и с десятичной точкой. + +Пример использования: + +```js +var re = /* ваш регэксп */ + +var str = "1.5 0 12. 123.4."; + +alert( str.match(re) ); // 1.5, 0, 12, 123.4 +``` \ No newline at end of file diff --git a/10-regular-expressions-javascript/7-regexp-quantifiers/4-find-decimal-numbers/solution.md b/10-regular-expressions-javascript/7-regexp-quantifiers/4-find-decimal-numbers/solution.md new file mode 100644 index 00000000..2abd91c0 --- /dev/null +++ b/10-regular-expressions-javascript/7-regexp-quantifiers/4-find-decimal-numbers/solution.md @@ -0,0 +1,13 @@ +Целое число с необязательной дробной частью -- это \d+(\.\d+)?. + +К этому нужно добавить необязательный `-` в начале: + + +```js +//+ run +var re = /-?\d+(\.\d+)?/g + +var str = "-1.5 0 2 -123.4."; + +alert( str.match(re) ); // -1.5, 0, 2, -123.4 +``` diff --git a/10-regular-expressions-javascript/7-regexp-quantifiers/4-find-decimal-numbers/task.md b/10-regular-expressions-javascript/7-regexp-quantifiers/4-find-decimal-numbers/task.md new file mode 100644 index 00000000..5c5d4d09 --- /dev/null +++ b/10-regular-expressions-javascript/7-regexp-quantifiers/4-find-decimal-numbers/task.md @@ -0,0 +1,13 @@ +# Найдите десятичные числа + +Создайте регэксп, который ищет все числа, в том числе и с десятичной точкой, в том числе и отрицательные. + +Пример использования: + +```js +var re = /* ваш регэксп */ + +var str = "-1.5 0 2 -123.4."; + +alert( str.match(re) ); // -1.5, 0, 2, -123.4 +``` \ No newline at end of file diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/1-lazy-greedy/task.md b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/1-lazy-greedy/task.md index ee0fd5a0..7076396f 100644 --- a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/1-lazy-greedy/task.md +++ b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/1-lazy-greedy/task.md @@ -1,11 +1,6 @@ # Совпадение для /d+? d+/ -Мы разобрали совпадение: -```js -"123 456".match(/\d+ \d+?/g) ); // 123 4 -``` - -А что будет, если сначала поставить ленивый, а потом жадный квантификаторы? +Что будет при таком поиске, когда сначало стоит ленивый, а потом жадный квантификаторы? ```js "123 456".match(/\d+? \d+/g) ); // какой результат? diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/2-difference-find-quote/solution.md b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/2-difference-find-quote/solution.md new file mode 100644 index 00000000..b47d89b3 --- /dev/null +++ b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/2-difference-find-quote/solution.md @@ -0,0 +1,16 @@ +Они очень похожи и, да, *почти* одинаковы. Оба ищут от одной кавычки до другой. + +Различие здесь в символе точка '.'. Как мы помним, точка '.' обозначает *любой символ, кроме перевода строки*. + +А [^"] -- это *любой символ, кроме кавычки '"'. + +Получатся, что первый регэксп "[^"]*" найдёт закавыченные строки с `\n` внутри, а второй регэксп ".*?" -- нет. + +Вот пример: +```js +//+ run +alert( '"многострочный \n текст"'.match(/"[^"]*"/) ); // найдёт + +alert( '"многострочный \n текст"'.match(/".*?"/) ); // null (нет совпадений) +``` + diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/2-difference-find-quote/task.md b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/2-difference-find-quote/task.md new file mode 100644 index 00000000..5e9dcf17 --- /dev/null +++ b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/2-difference-find-quote/task.md @@ -0,0 +1,5 @@ +# Различие между "[^"]*" и ".*?" + +Регулярные выражения "[^"]*" и ".*?" -- при выполнении одинаковы? + +Иначе говоря, существует ли такая строка, на которой они дадут разные результаты? Если да -- дайте такую строку. diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/3-find-html-comments/solution.md b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/3-find-html-comments/solution.md new file mode 100644 index 00000000..17bf43eb --- /dev/null +++ b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/3-find-html-comments/solution.md @@ -0,0 +1,18 @@ +Нужно найти начало комментария <!--, затем всё до конца -->. + +С первого взгляда кажется, что это сделает регулярное выражение <!--.*?--> -- квантификатор сделан ленивым, чтобы остановился, достигнув -->. + +Однако, точка в JavaScript -- любой символ, *кроме* конца строки. Поэтому такой регэксп не найдёт многострочный комментарий. + +Всё получится, если вместо точки использовать полностю "всеядный" [\s\S]. + +Итого: + +```js +//+ run +var re = //g; + +var str = '.. .. .. '; + +alert( str.match(re) ); // '', '' +``` \ No newline at end of file diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/3-find-html-comments/task.md b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/3-find-html-comments/task.md new file mode 100644 index 00000000..af0b1b2a --- /dev/null +++ b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/3-find-html-comments/task.md @@ -0,0 +1,11 @@ +# Найти HTML-комментарии + +Найдите все HTML-комментарии в тексте: + +```js +var re = ..ваш регэксп.. + +var str = '.. .. .. '; + +alert( str.match(re) ); // '', '' +``` diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/4-find-html-tags-greedy-lazy/solution.md b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/4-find-html-tags-greedy-lazy/solution.md new file mode 100644 index 00000000..6a87a597 --- /dev/null +++ b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/4-find-html-tags-greedy-lazy/solution.md @@ -0,0 +1,38 @@ +Начнём поиск с <, затем один или более произвольный символ, но до закрывающего "уголка": .+?>. + +Проверим, как работает этот регэксп: + +```js +//+ run +var re = /<.+?>/g; + +var str = '<> '; + +alert( str.match(re) ); // <> , , +``` + +Результат неверен! В качестве первого тега регэксп нашёл подстроку <> <a href="/">, но это явно не тег. + +Всё потому, что .+? -- это "любой символ (кроме `\n`), повторяющийся один и более раз до того, как оставшаяся часть шаблона совпадёт (ленивость)". + +Поэтому он находит первый `<`, затем есть "всё подряд" до следующего `>`. + +Первое совпадение получается как раз таким: + +``` +<.............> +<> +``` + +Правильным решением будет использовать <[^>]+>: + +```js +//+ run +var re = /<[^>]+>/g + +var str = '<> '; + +alert( str.match(re) ); // , , +``` + +Это же решение автоматически позволяет находится внутри тегу символу `\n`, который в класс точка `.` не входит. \ No newline at end of file diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/4-find-html-tags-greedy-lazy/task.md b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/4-find-html-tags-greedy-lazy/task.md new file mode 100644 index 00000000..43935130 --- /dev/null +++ b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/4-find-html-tags-greedy-lazy/task.md @@ -0,0 +1,18 @@ +# Найти HTML-теги + +Создайте регулярное выражение для поиска всех (открывающихся и закрывающихся) HTML-тегов вместе с атрибутами. + +Пример использования: +```js +//+ run +var re = /* ваш регэксп */ + +var str = '<> '; + +alert( str.match(re) ); // '', '', '' +``` + +В этой задаче можно считать, что тег начинается с <, заканчивается > и может содержать внутри любые символы, кроме < и >. + +Но хотя бы один символ внутри тега должен быть: <> -- не тег. +