diff --git a/1-js/1-getting-started/1-intro/limitations.svg b/1-js/1-getting-started/1-intro/limitations.svg index b1e32e40..f797f757 100644 --- a/1-js/1-getting-started/1-intro/limitations.svg +++ b/1-js/1-getting-started/1-intro/limitations.svg @@ -1 +1,93 @@ -limitations.svgCreated with bin/sketchtool.http://javascript.info&lt;script&gt;...&lt;/script&gt;http://gmail.comhttp://javascript.info \ No newline at end of file + + + + limitations.svg + Created with bin/sketchtool. + + + + + + + + http://javascript.info + + + <script> + ... + </script> + + + + + + + + http://gmail.com + + + + + + + + + + + + + + + + + + + + + + + + http://javascript.info + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/1-js/2-first-steps/5-variables/variable-change.svg b/1-js/2-first-steps/5-variables/variable-change.svg index 195cc79c..472eb447 100644 --- a/1-js/2-first-steps/5-variables/variable-change.svg +++ b/1-js/2-first-steps/5-variables/variable-change.svg @@ -1 +1,38 @@ -variable-change.svgCreated with bin/sketchtool.&quot;World!&quot;&quot;Hello!&quot;Message \ No newline at end of file + + + + variable-change.svg + Created with bin/sketchtool. + + + + + + + + + + "World!" + + + + + + "Hello!" + + + + + + Message + + + + + + + + + + + \ No newline at end of file diff --git a/1-js/2-first-steps/5-variables/variable.svg b/1-js/2-first-steps/5-variables/variable.svg index 1cb20edc..2199e553 100644 --- a/1-js/2-first-steps/5-variables/variable.svg +++ b/1-js/2-first-steps/5-variables/variable.svg @@ -1 +1,27 @@ -variable.svgCreated with bin/sketchtool.&quot;Hello!&quot;Message \ No newline at end of file + + + + variable.svg + Created with bin/sketchtool. + + + + + + + + + + + "Hello!" + + + + + + Message + + + + + \ No newline at end of file diff --git a/1-js/3-writing-js/2-coding-style/code-style.svg b/1-js/3-writing-js/2-coding-style/code-style.svg index 3f7bef70..4eeecc6c 100644 --- a/1-js/3-writing-js/2-coding-style/code-style.svg +++ b/1-js/3-writing-js/2-coding-style/code-style.svg @@ -1 +1,90 @@ -code-style.svgCreated with bin/sketchtool.2Между именем функциии скобкой ( нет пробелаОтступ2 пробелаПробел после for} else { без перевода строкиПробелы вокругвложенного вызовапустая строкамеждулогическими блокамидлина строкине более 80 символовточка с запятой ;обязательнаФигурная скобка {на той же строке, через пробелПробел междупараметрамиПробел междупараметрами \ No newline at end of file + + + + code-style.svg + Created with bin/sketchtool. + + + + + + + + + + + 2 + + + + + + Между именем функции + и скобкой ( нет пробела + + + + + Отступ + 2 пробела + + + + + Пробел после for + + + + + } else { без перевода строки + + + + + Пробелы вокруг + вложенного вызова + + + + + + + пустая строка + между + логическими блоками + + + + + длина строки + не более 80 символов + + + + + точка с запятой ; + обязательна + + + + + Фигурная скобка { + на той же строке, через пробел + + + + + + + Пробел между + параметрами + + + + + Пробел между + параметрами + + + + \ No newline at end of file diff --git a/1-js/3-writing-js/2-coding-style/figure-bracket-style.svg b/1-js/3-writing-js/2-coding-style/figure-bracket-style.svg index ac927e09..b388bce6 100644 --- a/1-js/3-writing-js/2-coding-style/figure-bracket-style.svg +++ b/1-js/3-writing-js/2-coding-style/figure-bracket-style.svg @@ -1 +1,32 @@ -figure-bracket-style.svgCreated with bin/sketchtool.Плохо!Фигурные скобки не имеют смыслаВ одну строку без скобок - приемлемо,если эта строка короткаяСамый лучший вариант \ No newline at end of file + + + + figure-bracket-style.svg + Created with bin/sketchtool. + + + + + + Плохо! + Фигурные скобки не имеют смысла + + + + + + + + В одну строку без скобок - приемлемо, + если эта строка короткая + + + Самый лучший вариант + + + + + + + + \ No newline at end of file diff --git a/1-js/5-functions-closures/6-memory-management/family-no-family.svg b/1-js/5-functions-closures/6-memory-management/family-no-family.svg index 561b46c6..8a6b18b5 100644 --- a/1-js/5-functions-closures/6-memory-management/family-no-family.svg +++ b/1-js/5-functions-closures/6-memory-management/family-no-family.svg @@ -1 +1,65 @@ -family-no-family.svgCreated with bin/sketchtool.windowКореньObjectObjectfatherwifename: &quot;Василий&quot;name: &quot;Мария&quot;motherObjecthusbandfamily: null \ No newline at end of file + + + + family-no-family.svg + Created with bin/sketchtool. + + + + + + + + window + + + Корень + + + + Object + + + + Object + + + father + + + wife + + + name: "Василий" + + + + name: "Мария" + + + mother + + + Object + + + + + + + husband + + + + + + family: null + + + + + + + + + \ No newline at end of file diff --git a/1-js/7-js-misc/3-setTimeout-setInterval/setinterval-interval.svg b/1-js/7-js-misc/3-setTimeout-setInterval/setinterval-interval.svg index 89a30d5c..aa5e3ab9 100644 --- a/1-js/7-js-misc/3-setTimeout-setInterval/setinterval-interval.svg +++ b/1-js/7-js-misc/3-setTimeout-setInterval/setinterval-interval.svg @@ -1 +1,41 @@ -setinterval-interval.svgCreated with bin/sketchtool.func(1)func(2)func(3)100200300 \ No newline at end of file + + + + setinterval-interval.svg + Created with bin/sketchtool. + + + + + + + func(1) + + + + + + func(2) + + + + + + func(3) + + + + + 100 + + + 200 + + + 300 + + + + + + \ No newline at end of file diff --git a/1-js/7-js-misc/3-setTimeout-setInterval/settimeout-interval.svg b/1-js/7-js-misc/3-setTimeout-setInterval/settimeout-interval.svg index 0956613a..f0895fed 100644 --- a/1-js/7-js-misc/3-setTimeout-setInterval/settimeout-interval.svg +++ b/1-js/7-js-misc/3-setTimeout-setInterval/settimeout-interval.svg @@ -1 +1,48 @@ -settimeout-interval.svgCreated with bin/sketchtool.func(1)func(2)func(3)100100 \ No newline at end of file + + + + settimeout-interval.svg + Created with bin/sketchtool. + + + + + + + func(1) + + + + + + func(2) + + + + + + func(3) + + + + + + + 100 + + + 100 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/10-regular-expressions-javascript/2-regexp-methods/article.md b/10-regular-expressions-javascript/2-regexp-methods/article.md index 91273f2b..d637ea65 100644 --- a/10-regular-expressions-javascript/2-regexp-methods/article.md +++ b/10-regular-expressions-javascript/2-regexp-methods/article.md @@ -8,7 +8,7 @@ [cut] -## str.search(regexp) +## str.search(reg) Этот метод мы уже видели. @@ -25,11 +25,11 @@ alert( str.search( *!*/лю/i*/!* ) ); // 0 Нельзя заставить `search` искать дальше первого совпадения, такой синтаксис попросту не предусмотрен. Но есть другие методы, которые это умеют. -## str.match(regexp) без флага g +## str.match(reg) без флага g Метод `str.match` работает по-разному, в зависимости от наличия или отсутствия флага `g`, поэтому сначала мы разберём вариант, когда его нет. -В этом случае `str.match(regexp)` находит только одно, первое совпадение. +В этом случае `str.match(reg)` находит только одно, первое совпадение. Результат вызова -- это массив, состоящий из этого совпадения, с дополнительными свойствами `index` -- позиция, на которой оно обнаружено и `input` -- строка, в которой был поиск. @@ -68,7 +68,7 @@ alert( result.input ); // javascript - это такой язык Позже мы ещё вернёмся к скобочным выражениям, они особенно удобны для поиска с заменой. -## str.match(regexp) с флагом g +## str.match(reg) с флагом g При наличии флага `g`, вызов `match` возвращает обычный массив из всех совпадений. @@ -116,7 +116,7 @@ alert( str.match( /лю/gi ).length ) // ошибка! нет свойства l ``` [/warn] -## str.split(regexp|substr, limit) +## str.split(reg|substr, limit) Разбивает строку в массив по разделителю -- регулярному выражению `regexp` или подстроке `substr`. @@ -136,7 +136,7 @@ alert( '12-34-56'.split('-') ) // [12, 34, 56] alert( '12-34-56'.split(/-/) ) // [12, 34, 56] ``` -## str.replace(regexp, newStr|function) +## str.replace(reg, str|func) Швейцарский нож для работы со строками, поиска и замены любого уровня сложности. @@ -158,6 +158,7 @@ alert( '12-34-56'.replace("-", ":") ) // 12:34-56 alert( '12-34-56'.replace( *!*/-/g*/!*, ":" ) ) // 12:34:56 ``` + В строке для замены можно использовать специальные символы: @@ -271,7 +272,7 @@ alert( str.replace( /(Василий) (Пупкин)/ , replacer) ) // Пупк Метод `test` проверяет, есть ли хоть одно совпадение в строке `str`. Возвращает `true/false`. -Работает, по сути, так же, как и проверка `str.search(regexp) != -1`, например: +Работает, по сути, так же, как и проверка `str.search(reg) != -1`, например: ```js //+ run @@ -306,7 +307,7 @@ alert( str.search(*!*/javascript/i*/!*) != -1 ) // false Он ведёт себя по-разному, в зависимости от того, есть ли у регэкспа флаг `g`. @@ -350,36 +351,38 @@ alert( regexp.exec(str).index ); // 49, поиск начат с 40й позиц Методы становятся гораздо понятнее, если разбить их использование по задачам, которые нужны в реальной жизни. +
+
Для поиска только одного совпадения:
+
+
+
Для поиска всех совпадений:
+
+ +
+ +
Для поиска-и-замены:
+
+ +
+
Для разбивки строки на части:
+
+ +
+
-Теперь, зная общие методы, мы можем перейти к более подробному изучению синтаксиса регулярных выражений. +Зная эти методы, мы уже можем использовать регулярные выражения. +Конечно, для этого желательно хорошо понимать их синтаксис и возможности, так что переходим к ним дальше. diff --git a/10-regular-expressions-javascript/3-regexp-character-classes/article.md b/10-regular-expressions-javascript/3-regexp-character-classes/article.md index 0ac5350f..668cfbe5 100644 --- a/10-regular-expressions-javascript/3-regexp-character-classes/article.md +++ b/10-regular-expressions-javascript/3-regexp-character-classes/article.md @@ -1,88 +1,95 @@ -# Символьные классы [todo] +# Классы и спецсимволы -Рассмотрим задачу -- есть телефонный номер `"+7(903)-123-45-67"`, и нам нужно найти в этой строке цифры, а остальные символы нас не интересуют. +Рассмотрим практическую задачу -- есть телефонный номер `"+7(903)-123-45-67"`, и нам нужно найти в этой строке цифры. А остальные символы нас не интересуют. + +Для поиска символов определённого вида в регулярных выражениях предусмотрены "классы символов". -**Для поиска символов определённого вида, в регулярных выражениях предусмотрены "классы символов".** [cut] -Класс символов -- это, в первую очередь, специальное обозначение. -Например, в данном случае нам нужен класс "произвольная цифра", он обозначается `\d`. +Класс символов -- это специальное обозначение, под которое подходит любой символ данного класса. -Это обозначение вставляется в паттерн наравне с остальными символами. При поиске под него подходит любая цифра. +Например, класс "любая цифра" обозначается `\d`. Это обозначение вставляется в паттерн наравне с остальными символами, и при поиске под него подходит любая цифра. -Пример ниже ищет все цифры в строке: +Регулярное выражение /\d/ ищет ровно одну цифру (первую): ```js //+ run var str = "+7(903)-123-45-67"; -var reg = /\d/g +var reg = /\d/; -alert( str.match(reg) ); // 7,9,0,3,1,2,3,4,5,6,7 +alert( str.match(reg) ); // 7 ``` -Есть и другие классы. Самые полезные: +...Ну а для поиска всех цифр достаточно добавить к нему флаг `g`: + +```js +//+ run +var str = "+7(903)-123-45-67"; + +var reg = /\d/g; + +alert( str.match(reg) ); // массив цифр: 7,9,0,3,1,2,3,4,5,6,7 +``` + +## Важнейшие классы + +Это был класс для цифр. + +Конечно же, есть и другие. Самые полезные классы:
`\d` (от английского "digit" - "цифра")
Цифра, символ от `0` до `9`.
`\s` (от английского "space" - "пробел")
Пробельный символ, включая табы, переводы строки и т.п.
`\w` (от английского "word" -- "слово")
-
Символ латинского алфавита или цифра или подчёркивание `'_'`
+
Символ латинского алфавита или цифра или подчёркивание `'_'`. Не-английские буквы не являются `\w`.
-**Регулярное выражение обычно содержит одновременно и обычные символы и классы**: +Регулярное выражение как правило содержит одновременно и обычные символы и классы. -Например, найдём строку `CSS` с любой цифровой версией: +Например, CSS\d найдёт строку CSS, с любой цифрой после неё. + +Пример ниже найдёт строку `CSS` с любой цифровой версией: ```js //+ run -var str = "Стандарт CSS4 - наше будущее"; +var str = "Стандарт CSS4 - это здорово"; var reg = /CSS\d/ -alert( str.match(reg) ); +alert( str.match(reg) ); // CSS4 ``` -Несколько классов в одном регэкспе: +Можно указать и несколько классов в одном регэкспе: ```js //+ run -showMatch( "Я люблю HTML5!", /\s\w\w\w\w\d/ ); // 'HTML5' +alert( "Я люблю HTML5!".match(/\s\w\w\w\w\d/) ); // 'HTML5' ``` Совпадение (каждому классу в регэкспе соответствует один символ результата): -**Также существуют обратные символьные классы:** + +## Обратные классы + +Для каждого символьного класса существует "обратный ему", представленный такой же, но заглавной буквой. + +"Обратный" -- означает, что ему соответствуют все остальные символы, например:
`\D`
-
Не-цифра, любой символ кроме `\d`
+
Не-цифра, то есть любой символ кроме `\d`, например буква.
`\S`
-
Не-пробел, любой символ кроме `\s`.
+
Не-пробел, то есть любой символ кроме `\s`, например буква.
`\W`
-
Символ, не принадлежащий латиннице, а также не буква и не подчёркивание, алфавиту, т.е. любой кроме `\w`
+
Любой символ, кроме `\w`, то есть не латинница, не подчёркивание, не цифра. В частности, русские буквы принадлежат этому классу.
-Например, мы хотим получить из телефона +7(903)-123-45-67 только цифры. +В начале этой главы мы видели, как получить из телефона +7(903)-123-45-67 все цифры. -Есть два способа сделать это. - -
    -
  1. Первый -- найти все цифры и объединить их: -Например: - -```js -//+ run -var str = "+7(903)-123-45-67"; - -var digits = str.match( /\d/g ).join(""); -alert(digits); // 79031234567 -``` - -
  2. -
  3. Второй -- найти все НЕцифры и удалить их из строки: +Первый способ -- найти все цифры через `match(/\d/g)`, но есть и альтернативный -- найти все НЕцифры и удалить их из строки: ```js //+ run @@ -91,53 +98,59 @@ var str = "+7(903)-123-45-67"; alert( str.replace(/\D/g, "") ); // 79031234567 ``` -Второй способ короче, не правда ли? -
  4. -
+## Спецсимволы -**Регулярное выражение может также содержать стандартные спецсимволы строк, такие как `\n, \t` и другие.** +Регулярное выражение может также содержать стандартные спецсимволы строк, такие как перевод строки `\n`, табуляцию `\t` и другие. -Они являются обычными символами. Отличить их от классов очень просто -- для классов зарезервированы другие буквы. +Отличить их от классов очень просто -- для классов зарезервированы другие буквы. Так что никакого конфликта здесь нет. + +## Пробелы -[warn header="Пробелы важны!"] Обычно мы не обращаем внимание на пробелы. Для нашего взгляда строки 1-5 и 1 - 5 почти идентичны. -Но в регулярных выражениях **пробел - такой же символ, как и другие**. +Но в регулярных выражениях пробел - такой же символ, как и другие. -Поиск ниже не сработает, т.к. не учитывает пробелы вокруг дефиса: +Поиск ниже не сработает, так как не учитывает пробелы вокруг дефиса: ```js //+ run alert( "1 - 5".match (/\d-\d/) ); // null, нет совпадений! ``` -Поправим это, добавив в паттерн пробелы: +Поправим это, добавив в регэксп пробелы: ```js //+ run alert( "1 - 5".match (/\d - \d/) ); // работает, пробелы вокруг дефиса ``` -В регулярные выражения также не надо вставлять лишние пробелы. Все они имеют значение: +В регулярные выражения также не надо вставлять лишние пробелы. Все символы имеют значение: ```js //+ run alert( "1-5".match( /\d - \d/ ) ); // null, так как в строке 1-5 нет пробелов ``` -[/warn] - +## Класс точка + Особым классом символов является точка `"."`. -**В регулярном выражении, точка "." обозначает *любой символ*, кроме перевода строки**: +В регулярном выражении, точка "." обозначает *любой символ*, кроме перевода строки: + +```js +//+ run +alert( "Z".match(/./) ); // найдено Z +``` + +Посередине регулярного выражения: ```js //+ run var re = /CS.4/; -alert( "Стандарт CSS4".match(re) ); // найдено "CSS4" -alert( "Сталь CS-4".match(re) ); // найдено "CS-4" -alert( "CS 4".match(re) ); // найдено "CS 4", пробел тоже символ +alert( "CSS4".match(re) ); // найдено "CSS4" +alert( "CS-4".match(re) ); // найдено "CS-4" +alert( "CS 4".match(re) ); // найдено "CS 4" (пробел тоже символ) ``` Обратим внимание -- точка означает именно "произвольный символ". @@ -146,7 +159,71 @@ alert( "CS 4".match(re) ); // найдено "CS 4", пробел тоже си ```js //+ run - alert( "CS4".match (/CS.4/) ); // нет совпадений, так как для точки нет символа ``` +## Экранирование специальных символов + +В регулярных выражениях есть и другие символы, имеющие особый смысл. + +Они используются, чтобы расширить возможности поиска. + +Вот их полный список: [ \ ^ $ . | ? * + ( ). + +Не пытайтесь запомнить его -- когда мы разберёмся с каждым из них по отдельности, он запомнится сам собой. + +**Чтобы использовать специальный символ в качестве обычного, он должен быть *экранирован*.** + +Или, другими словами, перед символом должен быть обратный слэш `'\'`. + +Например, нам нужно найти точку '.'. В регулярном выражении она означает "любой символ, кроме новой строки", поэтому чтобы найти именно сам символ "точка" -- её нужно экранировать: \.. + +```js +//+ run +alert( "Глава 5.1".match( /\d\.\d/ ) ); // 5.1 +``` + +Круглые скобки также являются специальными символами, так что для поиска именно скобки нужно использовать `\(`. Пример ниже ищет строку `"g()"`: + +```js +//+ run +alert( "function g()".match( /g\(\)/ ) ); // "g()" +``` + +Сам символ слэш `'/'`, хотя и не является специальными символом в регулярных выражениях, но открывает-закрывает регэксп в синтаксисе /...pattern.../, поэтому его тоже нужно экранировать. + +Так выглядит поиск слэша `'/'`: + +```js +//+ run +alert( "/".match( /\// ) ); // '/' +``` + +Ну и, наконец, если нам нужно найти сам обратный слэш `\`, то его нужно просто задублировать. + +Так выглядит поиск обратного слэша `"\"`: + +```js +//+ run +alert( "1\2".match( /\\/ ) ); // '\' +``` + +## Итого + +Мы рассмотрели классы для поиска типов символов: + + + +Кроме того, в регэкспах допустимы и обычные спец-символы строк, например `\n`. + +Если хочется поискать именно точку или какой-то другой "особый" символ, то его экранируют: \. + + + diff --git a/10-regular-expressions-javascript/4-regexp-special-characters/article.md b/10-regular-expressions-javascript/4-regexp-special-characters/article.md deleted file mode 100644 index 1f08dd20..00000000 --- a/10-regular-expressions-javascript/4-regexp-special-characters/article.md +++ /dev/null @@ -1,46 +0,0 @@ -# Экранирование специальных символов - -В регулярных выражениях есть и другие символы, имеющие особый смысл. - -Они используются, чтобы расширить возможности поиска. - -Вот их полный список: [ \ ^ $ . | ? * + ( ). - -Не пытайтесь запомнить его -- когда мы разберёмся с каждым из них по отдельности, он запомнится сам собой. - -**Чтобы использовать специальный символ в качестве обычного, он должен быть *экранирован*.** - -Или, другими словами, перед символом должен быть обратный слэш `'\'`. - -Например, нам нужно найти точку '.'. В регулярном выражении она означает "любой символ, кроме новой строки", поэтому чтобы найти именно сам символ "точка" -- её нужно экранировать: \.. - -```js -//+ run -alert( "Глава 5.1".match( /\d\.\d/ ) ); // 5.1 -``` - -Круглые скобки также являются специальными символами, так что для поиска именно скобки нужно использовать `\(`. Пример ниже ищет строку `"g()"`: - -```js -//+ run -alert( "function g()".match( /g\(\)/ ) ); // "g()" -``` - -**Слэш `'/'`, хотя и не является специальными символом, но открывает-закрывает регэксп в синтаксисе /...pattern.../. Поэтому его тоже нужно экранировать: '\/'**. - -Так выглядит поиск слэша `'/'`: - -```js -//+ run -alert( "/".match( /\// ) ); // '/' -``` - -Ну и, наконец, если нам нужно найти сам обратный слэш `\`, то его нужно просто задублировать. - -Так выглядит поиск обратного слэша `"\"`: - -```js -//+ run -alert( "1\2".match( /\\/ ) ); // '\' -``` - diff --git a/10-regular-expressions-javascript/5-regexp-character-sets-and-ranges/article.md b/10-regular-expressions-javascript/5-regexp-character-sets-and-ranges/article.md index ee32ba08..2cc997de 100644 --- a/10-regular-expressions-javascript/5-regexp-character-sets-and-ranges/article.md +++ b/10-regular-expressions-javascript/5-regexp-character-sets-and-ranges/article.md @@ -1,12 +1,14 @@ # Наборы и диапазоны [...] -Если в регулярном выражении нескольки символов или символьных классов заключены в квадратные скобки `[…]`, то это означает "искать любой символ из указанных в `[…]`". +Если в регулярном выражении несколько символов или символьных классов заключены в квадратные скобки `[…]`, то это означает "искать любой символ из указанных в `[…]`". + +[cut] + +## Набор Например, [еао] означает любой символ из этих трёх: `'а'`, `'е'`, или `'о'`. -[cut] -Можно использовать квадратные скобки вместе с обычными символами. -Например: +Такое обозначение называют *набором*. Наборы используются в регулярном выражении наравне с обычными символами: ```js //+ run @@ -14,7 +16,7 @@ alert( "Гоп-стоп".match( /[гт]оп/gi ) ); // "Гоп", "топ" ``` -Несмотря на то, что в квадратных скобках несколько символов, в совпадении должен присутствовать *ровно один* из них. +Обратим внимание: несмотря на то, что в наборе указано несколько символов, в совпадении должен присутствовать *ровно один* из них. Поэтому в примере ниже нет результатов: @@ -24,13 +26,22 @@ alert( "Гоп-стоп".match( /[гт]оп/gi ) ); // "Гоп", "топ" alert( "Вуаля".match( /В[уа]ля/ ) ); // совпадений нет ``` -Совпадение было бы, если бы после `"Ву"` шло сразу `"ля"`, например Вуля или если бы `"Ва"` сопровождалось `"ля"`, то есть Валя. +Поиск подразумевает: + -**Квадратные скобки могут также содержать *диапазоны символов*.** +Таким образом, совпадение было бы для строки Вуля или Валя. + +## Диапазоны + +Квадратные скобки могут также содержать *диапазоны символов*. Например, [a-z] -- произвольный символ от `a` до `z`, [0-5] -- цифра от `0` до `5`. -В примере ниже мы будем искать `"x"`, после которого идёт два раза `[0-9A-F]` -- цифра или буква от A до F: +В примере ниже мы будем искать `"x"`, после которого идёт два раза любая цифра или буква от A до F: ```js //+ run @@ -38,7 +49,7 @@ alert( "Вуаля".match( /В[уа]ля/ ) ); // совпадений нет alert( "Exception 0xAF".match(/x[0-9A-F][0-9A-F]/g) ); ``` -Обратим внимание, в слове Exception есть сочетание xce, но оно не подошло, потому что буквы в нём маленькие, а в диапазоне -- большие. +Обратим внимание, в слове Exception есть сочетание xce, но оно не подошло, потому что буквы в нём маленькие, а в диапазоне [0-9A-F] -- большие. Если хочется искать и его тоже, можно добавить в скобки диапазон `a-f`: [0-9A-Fa-f]. Или же просто указать у всего регулярного выражения флаг `i`. @@ -50,9 +61,9 @@ alert( "Exception 0xAF".match(/x[0-9A-F][0-9A-F]/g) );
  • **\s** -- то же самое, что [\t\n\v\f\r ] плюс несколько юникодных пробельных символов.
  • -**В квадратных скобках можно использовать и диапазоны и символьные классы -- вместе.** +В квадратных скобках можно использовать и диапазоны и символьные классы -- вместе. -Например, нам нужно найти слова в тексте. Если оно на английском -- это достаточно просто: +Например, нам нужно найти все слова в тексте. Если они на английском -- это достаточно просто: ```js //+ run @@ -72,7 +83,9 @@ alert( str.match( /\w+/g ) ); // null*!* Ничего не найдено! Это можно понять, ведь \w -- это именно английская букво-цифра, как можно видеть из аналога [a-zA-Z0-9_]. -Чтобы находило слово на русском -- нужно использовать диапазон, например /[а-я]/. А чтобы на обоих языках -- и то и другое вместе: +Чтобы находило слово на русском -- нужно использовать диапазон, например /[а-я]/. + +А чтобы на обоих языках -- и то и другое вместе: ```js //+ run @@ -81,7 +94,9 @@ var str = "Солнце (the sun) встаёт!"; alert( str.match( /[\wа-я]+/gi ) ); // Солнце, the, sun, вста, т*!* ``` -...Присмотритесь внимательно к предыдущему примеру! Вы видите странность? Оно не находит букву ё, более того -- считает её разрывом в слове. Причина -- в кодировке юникод, она подробно раскрыта в главе [](/string). Буква `ё` лежит в стороне от основной кириллицы и её следует добавить в диапазон дополнительно, вот так: +...Присмотритесь внимательно к предыдущему примеру! Вы видите странность? Оно не находит букву ё, более того -- считает её разрывом в слове. Причина -- в кодировке юникод, она подробно раскрыта в главе [](/string). + +Буква `ё` лежит в стороне от основной кириллицы и её следует добавить в диапазон дополнительно, вот так: ```js //+ run @@ -92,6 +107,8 @@ alert( str.match( /[\wа-яё]+/gi ) ); // Солнце, the, sun, встаёт* Теперь всё в порядке. +## Диапазоны "кроме" + **Кроме обычных, существуют также *исключающие* диапазоны: [^…].** Квадратные скобки, начинающиеся со знака каретки: [^…] находят любой символ, *кроме указанных*. @@ -99,9 +116,9 @@ alert( str.match( /[\wа-яё]+/gi ) ); // Солнце, the, sun, встаёт* Например: Пример ниже ищет любые символы, кроме букв, цифр и пробелов: @@ -111,28 +128,31 @@ alert( str.match( /[\wа-яё]+/gi ) ); // Солнце, the, sun, встаёт* alert( "alice15@gmail.com".match( /[^\d\sA-Z]/gi ) ); // "@", "." ``` -**В квадратных скобках большинство специальных символов можно использовать без экранирования.** +## Не нужно экранирование -Обычно, если мы хотим искать именно точку, а не любой символ, или именно `"\d"`, а не произвольную цифру, то мы используем экранирование: указываем `\.` или `\\d`. +Обычно, если мы хотим искать именно точку, а не любой символ, или именно символ `\`, то мы используем экранирование: указываем `\.` или `\\`. -Но квадратные скобки подразумевают поиск одного символа из нескольких или из диапазона. Использование некоторых специальных символов внутри них не имело бы смысла, и они воспринимаются как обычные символы. +В квадратных скобках большинство специальных символов можно использовать без экранирования, если конечно ни не имеют какой-то особый смысл именно внутри квадратных скобок. -Это касается символов: +То есть, "как есть", без экранирования можно использовать символы: То есть, точка `"."` в квадратных скобках означает не "любой символ", а обычную точку. -Например, регэксп [-().^+] ищет один из символов `-().^`. В данном контексте эти символы не являются специальными. +Регэксп [.,] ищет один из символов "точка" или "запятая". + +В примере ниже регэксп [-().^+] ищет один из символов `-().^`. Они не экранированы: ```js //+ run +// Без экранирования var re = /[-().^+]/g; alert( "1 + 2 - 3".match(re) ); // найдёт +, - @@ -142,6 +162,7 @@ alert( "1 + 2 - 3".match(re) ); // найдёт +, - ```js //+ run +// Всё заэкранировали var re = /[\-\(\)\.\^\+]/g; alert( "1 + 2 - 3".match(re) ); // тоже работает: +, - diff --git a/10-regular-expressions-javascript/6-regexp-numeric-quantifiers/article.md b/10-regular-expressions-javascript/6-regexp-numeric-quantifiers/article.md deleted file mode 100644 index 0eced219..00000000 --- a/10-regular-expressions-javascript/6-regexp-numeric-quantifiers/article.md +++ /dev/null @@ -1,47 +0,0 @@ -# Цифровые квантификаторы {n} - -Рассмотрим задачу -- взять телефон вида `+7(903)-123-45-67` и найти все числа в нём. То есть, нас интересует результат вида `7, 903, 123, 45, 67`. - -Нечто похожее мы уже делали ранее -- мы искали цифры. Для этого было достаточно класса `\d`. Но здесь нужно искать *числа* -- последовательности из 1 или более цифр. - -**Количество повторений символа можно указать с помощью числа в фигурных скобках: `{n}`.** - -
    -
    Точное количество: `{5}`
    -
    Паттерн \d{5} обозначает 5 цифр, как и -
    Количество от-до: `{3,5}`
    -
    Для того, чтобы найти, например, числа размером от трёх до пяти знаков, нужно указать границы в фигурных скобках: `\d{3,5}` - -```js -//+ run -alert( "Мне не 12, а 1234 года".match( /\d{3,5}/ ) ); // "1234" -``` - -Последнее значение можно и не указывать. Тогда выражение `\d{3,}` найдет числа, длиной от трех знаков: - -```js -//+ run -alert( "Мне не 12, а 345678 лет".match( /\d{3,5}/ ) ); // "345678" -``` - -
    -
    - -В случае с телефоном нам нужны числа - одна или более цифр подряд. Этой задаче соответствует регулярное выражение \d{1,}: - -```js -//+ run -var str = "+7(903)-123-45-67"; - -alert( str.match( /\d{1,}/g ) ); // 7,903,123,45,67 -``` - diff --git a/10-regular-expressions-javascript/6-regexp-numeric-quantifiers/1-find-text-manydots/solution.md b/10-regular-expressions-javascript/7-regexp-quantifiers/1-find-text-manydots/solution.md similarity index 100% rename from 10-regular-expressions-javascript/6-regexp-numeric-quantifiers/1-find-text-manydots/solution.md rename to 10-regular-expressions-javascript/7-regexp-quantifiers/1-find-text-manydots/solution.md diff --git a/10-regular-expressions-javascript/6-regexp-numeric-quantifiers/1-find-text-manydots/task.md b/10-regular-expressions-javascript/7-regexp-quantifiers/1-find-text-manydots/task.md similarity index 100% rename from 10-regular-expressions-javascript/6-regexp-numeric-quantifiers/1-find-text-manydots/task.md rename to 10-regular-expressions-javascript/7-regexp-quantifiers/1-find-text-manydots/task.md diff --git a/10-regular-expressions-javascript/7-regexp-quantifiers/article.md b/10-regular-expressions-javascript/7-regexp-quantifiers/article.md index f71e8c51..ac0b6608 100644 --- a/10-regular-expressions-javascript/7-regexp-quantifiers/article.md +++ b/10-regular-expressions-javascript/7-regexp-quantifiers/article.md @@ -1,8 +1,60 @@ -# Квантификаторы +, * и ? +# Квантификаторы +, *, ? и {n} + +Рассмотрим ту же задачу, что и ранее -- взять телефон вида `+7(903)-123-45-67` и найти все числа в нём. Но теперь нас интересуют не цифры по отдельности, а именно числа, то есть результат вида `7, 903, 123, 45, 67`. + +Для поиска цифр по отдельности нам было достаточно класса `\d`. Но здесь нужно искать *числа* -- последовательности из 1 или более цифр. + +## Количество {n} + +Количество повторений символа можно указать с помощью числа в фигурных скобках: `{n}`. + +Такое указание называют *квантификатором* (от англ. quantifier). + +У него есть несколько подформ записи: + +
    +
    Точное количество: `{5}`
    +
    Регэксп \d{5} обозначает ровно 5 цифр, в точности как \d\d\d\d\d. + +Следующий пример находит пятизначное число. + +```js +//+ run +alert( "Мне 12345 лет".match (/\d{5}/) ); // "12345" +``` + +
    +
    Количество от-до: `{3,5}`
    +
    Для того, чтобы найти, например, числа размером от трёх до пяти знаков, нужно указать границы в фигурных скобках: \d{3,5} + +```js +//+ run +alert( "Мне не 12, а 1234 года".match( /\d{3,5}/ ) ); // "1234" +``` + +Последнее значение можно и не указывать. Тогда выражение \d{3,} найдет числа, длиной от трех цифр: + +```js +//+ run +alert( "Мне не 12, а 345678 лет".match( /\d{3,5}/ ) ); // "345678" +``` +
    +
    + +В случае с телефоном нам нужны числа -- одна или более цифр подряд. Этой задаче соответствует регулярное выражение \d{1,}: + +```js +//+ run +var str = "+7(903)-123-45-67"; + +alert( str.match( /\d{1,}/g ) ); // 7,903,123,45,67 +``` + + +## Короткие обозначения Для самые часто востребованных квантификаторов есть специальные короткие обозначения. -[cut]
    `+`
    Означает "один или более", то же что `{1,}`. @@ -20,11 +72,13 @@ alert( str.match( /\d+/g ) ); // 7,903,123,45,67
    `?`
    Означает "ноль или один", то же что и `{0,1}`. По сути, делает символ необязательным. -Например, ou?r найдёт or в слове color и our в его британском варианте написания colour. +Например, регэксп ou?r найдёт o, после которого, возможно, следует u, а затем r. + +Этот регэксп найдёт or в слове color и our в colour: ```js //+ run -var str = "Можно писать color или colour"; +var str = "Можно писать color или colour (британский вариант)"; alert( str.match( /colou?r/g ) ); // color, colour ``` @@ -50,19 +104,22 @@ alert( "100 10 1".match( /\d0+/g ) ); // 100, 10
    -Эти квантификаторы -- одни из важнейших "строительных блоков" для сложных регулярных выражений, поэтому мы рассмотрим ещё примеры. +## Ещё примеры + +Эти квантификаторы принадлежат к числу самых важных "строительных блоков" для сложных регулярных выражений, поэтому мы рассмотрим ещё примеры.
    -
    Десятичная дробь (число с точкой внутри): \d+\.\d+
    +
    Регэксп "десятичная дробь" (число с точкой внутри): \d+\.\d+
    +В действии: ```js //+ run alert( "0 1 12.345 7890".match( /\d+\.\d+/g ) ); // 123.45 ```
    -
    Открывающий HTML-тег без атрибутов, такой как `` или `

    `: /<[a-z]+>/i

    +
    Регэксп "открывающий HTML-тег без атрибутов", такой как `` или `

    `: /<[a-z]+>/i

    Пример: ```js @@ -72,7 +129,7 @@ alert( " ... ".match ( /<[a-z]+>/gi ) ); // Это регулярное выражение ищет символ '<', за которым идут одна или более букв английского алфавита, и затем '>'.
    -
    Открывающий HTML-тег без атрибутов (лучше): /<[a-z][a-z0-9]*>/i
    +
    Регэксп "открывающий HTML-тег без атрибутов" (лучше): /<[a-z][a-z0-9]*>/i
    Здесь регулярное выражение расширено: в соответствие со стандартом, HTML-тег может иметь символ на любой позиции, кроме первой, например `

    `. @@ -82,7 +139,7 @@ alert( "

    Привет!

    ".match( /<[a-z][a-z0-9]*>/gi ) ); //

    ```

    -
    Открывающий или закрывающий HTML-тег без атрибутов: /<\/?[a-z][a-z0-9]*>/i
    +
    Регэксп "открывающий или закрывающий HTML-тег без атрибутов": /<\/?[a-z][a-z0-9]*>/i
    В предыдущий паттерн добавили необязательный слэш /? перед тегом. Его понадобилось заэкранировать, чтобы JavaScript не принял его за конец шаблона. ```js @@ -95,13 +152,11 @@ alert( "

    Привет!

    ".match( /<\/?[a-z][a-z0-9]*>/gi ) ); //

    , <\w+>. -Так как класс `\w` означает "любая цифра или английская буква или _`, то под такой шаблон подойдут и не теги, например <_>, однако он гораздо проще, чем <[a-z][a-z0-9]*>. +Так как класс `\w` означает "любая цифра или английская буква или `'_'`, то под такой регэксп подойдут и не теги, например <_>. Однако он гораздо проще, чем более точный регэксп <[a-z][a-z0-9]*>. Подойдёт ли нам <\w+> или нужно использовать именно <[a-z][a-z0-9]*>? diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/article.md b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/article.md index 2e3bbd51..483116d9 100644 --- a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/article.md +++ b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/article.md @@ -1,13 +1,18 @@ -# Жадный и ленивый режимы +# Жадные и ленивые квантификаторы [todo] -Теперь время залезть "под капот" регулярных выражений и посмотреть, как происходит поиск. +Квантификаторы -- с виду очень простая, но на самом деле очень хитрая штука. + +Необходимо очень хорошо понимать, как именно происходит поиск, если конечно мы хотим искать что-либо сложнее чем /\d+/. -Это понимание необходимо для того, чтобы искать что-либо сложнее чем /\d+/. [cut] -Для примера рассмотрим задачу, которая часто возникает в типографике -- заменить кавычки вида `"..."` на "кавычки-лапки": `«...»`. +Для примера рассмотрим задачу, которая часто возникает в типографике -- заменить в тексте кавычки вида `"..."` (их называют "английские кавычки") на "кавычки-ёлочки": `«...»`. -Шаблон, который мы будем использовать для поиска подстрок в кавычках, будет выглядеть так: +Для этого нужно сначала найти все слова в таких кавычках. + +Соотверствующее регулярное выражение может выглядеть так: /".+"/g, то есть мы ищем кавычку, после которой один или более произвольный символ, и в конце опять кавычка. + +Однако, если попробовать применить его на практике, даже на таком простом случае... ```js //+ run @@ -15,38 +20,48 @@ var reg = /".+"/g; var str = 'a "witch" and her "broom" is one'; -alert( str.match(reg) ); +alert( str.match(reg) ); // "witch" and her "broom" ``` -Запустите этот пример... +...Мы увидим, что оно работает совсем не так, как задумано! -Упс! Он не работает! Вместо того, чтобы найти два совпадения "witch" и "broom", он находит одно: "witch" and her "broom". +Вместо того, чтобы найти два совпадения "witch" и "broom", оно находит одно: "witch" and her "broom". Это как раз тот случай, когда *жадность* -- причина всех зол. -## Алгоритм поиска +## Жадный поиск -Движок регулярных выражений пытается проверить строку на соответствие шаблону, начиная с самой первой, нулевой позиции. Если не получается, он идёт вперёд и пытается найти с 1й позиции и так далее. +Чтобы найти совпадение, движок регулярных выражений обычно использует следующий алгоритм: -Чтобы сделать происходящее максимально наглядным и понятным, проследим, что именно он делает для паттерна ".+". +
      +
    • Для каждой позиции в поисковой строке +
        +
      • Проверить совпадение на данной позиции +
        • Посимвольно, с учётом классов и квантификаторов сопоставив с ней регулярное выражение.
        +
      • +
      +
    • +
    + +Это общие слова, гораздо понятнее будет, если мы проследим, что именно он делает для регэкспа ".+".
    1. Первый символ шаблона -- это кавычка ". -Движок регулярных выражений пытается найти её на 0й позиции, но там совсем другой символ, поэтому на 0й позиции соответствия явно нет. +Движок регулярных выражений пытается сопоставить её на 0й позиции в строке, но символ `a`, поэтому на 0й позиции соответствия явно нет. Далее он переходит 1ю, 2ю позицию в исходной строке и, наконец, обнаруживает кавычку на 3й позиции: - +
    2. Кавычка найдена, далее движок проверяет, есть ли соответствие для остальной части паттерна. В данном случае следующий символ паттерна -- `.` (точка). Она обозначает "любой символ", так что следующая буква строки 'w' вполне подходит: - +
    3. Далее "любой символ" повторяется, так как стоит квантификатор .+. Движок регулярных выражений берёт один символ за другим, до тех пор, пока у него это получается. В данном случае это означает "до конца строки": - +
    4. Итак, текст закончился, движок регулярных выражений больше не может найти "любой символ", он закончил строить соответствие для .+ и очень рад по этому поводу. diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy1.png b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy1.png deleted file mode 100644 index adee0ccd..00000000 Binary files a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy1.png and /dev/null differ diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy1.svg b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy1.svg new file mode 100644 index 00000000..9db83ff6 --- /dev/null +++ b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy1.svg @@ -0,0 +1,20 @@ + + + + witch_greedy1.svg + Created with bin/sketchtool. + + + + + a "witch" and her "broom" is one + + + " + + + + + + + \ No newline at end of file diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy2.png b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy2.png deleted file mode 100644 index 878b0160..00000000 Binary files a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy2.png and /dev/null differ diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy2.svg b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy2.svg new file mode 100644 index 00000000..4ffbd589 --- /dev/null +++ b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy2.svg @@ -0,0 +1,20 @@ + + + + witch_greedy2.svg + Created with bin/sketchtool. + + + + + a "witch" and her "broom" is one + + + ". + + + + + + + \ No newline at end of file diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy3.png b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy3.png deleted file mode 100644 index 7a8adbcf..00000000 Binary files a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy3.png and /dev/null differ diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy3.svg b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy3.svg new file mode 100644 index 00000000..a73b5063 --- /dev/null +++ b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy3.svg @@ -0,0 +1,20 @@ + + + + witch_greedy3.svg + Created with bin/sketchtool. + + + + + a "witch" and her "broom" is one + + + "...................... + ....... + + + + + + \ No newline at end of file diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy4.png b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy4.png deleted file mode 100644 index 3e634466..00000000 Binary files a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy4.png and /dev/null differ diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy4.svg b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy4.svg new file mode 100644 index 00000000..d76d61de --- /dev/null +++ b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy4.svg @@ -0,0 +1,21 @@ + + + + witch_greedy4.svg + Created with bin/sketchtool. + + + + + a "witch" and her "broom" is one + + + "...................... + ...... + " + + + + + + \ No newline at end of file diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy5.png b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy5.png deleted file mode 100644 index 5b80ba67..00000000 Binary files a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy5.png and /dev/null differ diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy5.svg b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy5.svg new file mode 100644 index 00000000..09c28004 --- /dev/null +++ b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy5.svg @@ -0,0 +1,21 @@ + + + + witch_greedy5.svg + Created with bin/sketchtool. + + + + + a "witch" and her "broom" is one + + + "...................... + ..... + ". + + + + + + \ No newline at end of file diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy6.png b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy6.png deleted file mode 100644 index d958c53b..00000000 Binary files a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy6.png and /dev/null differ diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy6.svg b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy6.svg new file mode 100644 index 00000000..f292ebc1 --- /dev/null +++ b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy6.svg @@ -0,0 +1,20 @@ + + + + witch_greedy6.svg + Created with bin/sketchtool. + + + + + a "witch" and her "broom" is one + + + "....................." + ....... + + + + + + \ No newline at end of file diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy3.png b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy3.png deleted file mode 100644 index 3c0b20f5..00000000 Binary files a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy3.png and /dev/null differ diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy3.svg b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy3.svg new file mode 100644 index 00000000..efb9a034 --- /dev/null +++ b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy3.svg @@ -0,0 +1,20 @@ + + + + witch_lazy3.svg + Created with bin/sketchtool. + + + + + a "witch" and her "broom" is one + + + ". + " + + + + + + \ No newline at end of file diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy4.png b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy4.png deleted file mode 100644 index 9ad8af3e..00000000 Binary files a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy4.png and /dev/null differ diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy4.svg b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy4.svg new file mode 100644 index 00000000..36a03d38 --- /dev/null +++ b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy4.svg @@ -0,0 +1,20 @@ + + + + witch_lazy4.svg + Created with bin/sketchtool. + + + + + a "witch" and her "broom" is one + + + ".. + " + + + + + + \ No newline at end of file diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy6.png b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy6.png deleted file mode 100644 index 77ecd34a..00000000 Binary files a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy6.png and /dev/null differ diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy6.svg b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy6.svg new file mode 100644 index 00000000..5ad6b9e2 --- /dev/null +++ b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy6.svg @@ -0,0 +1,19 @@ + + + + witch_lazy6.svg + Created with bin/sketchtool. + + + + + a "witch" and her "broom" is one + + + "....." "....." + + + + + + \ No newline at end of file diff --git a/12-css-for-js/10-box-sizing/border-box.svg b/12-css-for-js/10-box-sizing/border-box.svg index fd9c586b..9b8a0936 100644 --- a/12-css-for-js/10-box-sizing/border-box.svg +++ b/12-css-for-js/10-box-sizing/border-box.svg @@ -1 +1,40 @@ -border-box.svgCreated with bin/sketchtool.СодержимоеСодержимоеborder-boxcontent-boxborder: 5px;padding: 20px; \ No newline at end of file + + + + border-box.svg + Created with bin/sketchtool. + + + + + Содержимое + + + Содержимое + + + + + + + + + border-box + + + content-box + + + + + + + + border: 5px; + + padding: 20px; + + + + + \ No newline at end of file diff --git a/4-ajax/5-xhr-crossdomain/xhr-another-domain.svg b/4-ajax/5-xhr-crossdomain/xhr-another-domain.svg index 120b5d87..7a11b490 100644 --- a/4-ajax/5-xhr-crossdomain/xhr-another-domain.svg +++ b/4-ajax/5-xhr-crossdomain/xhr-another-domain.svg @@ -1 +1,50 @@ -xhr-another-domain.svgCreated with bin/sketchtool.JavaScriptБраузерСерверsend()HTTP-запросс заголовком OriginHTTP-ответAccess-Control-Allow-Origin: * или Originесли заголовок стоит onloadиначе onerror \ No newline at end of file + + + + xhr-another-domain.svg + Created with bin/sketchtool. + + + + + + JavaScript + + + + Браузер + + + + Сервер + + + + + + + + send() + + + + + HTTP-запрос + с заголовком Origin + + + + + + + HTTP-ответ + Access-Control-Allow-Origin: * или Origin + + + + если заголовок стоит onload + иначе onerror + + + + \ No newline at end of file diff --git a/4-ajax/5-xhr-crossdomain/xhr-preflight.svg b/4-ajax/5-xhr-crossdomain/xhr-preflight.svg index 6bf2aa00..86d951d4 100644 --- a/4-ajax/5-xhr-crossdomain/xhr-preflight.svg +++ b/4-ajax/5-xhr-crossdomain/xhr-preflight.svg @@ -1 +1,67 @@ -xhr-preflight.svgCreated with bin/sketchtool.JavaScriptБраузерСерверsend()OPTIONSOriginAccess-Control-Request-MethodAccess-Control-Request-Headers200 OKAccess-Control-Allow-MethodAccess-Control-Allow-HeadersAccess-Control-Max-AgeHTTP-ответAccess-Control-Allow-Originесли сервер разрешил: onloadиначе onerrorОсновной HTTP-запросOrigin \ No newline at end of file + + + + xhr-preflight.svg + Created with bin/sketchtool. + + + + + + JavaScript + + + + Браузер + + + + Сервер + + + + + + + + send() + + + OPTIONS + Origin + Access-Control-Request-Method + Access-Control-Request-Headers + + + + + 200 OK + Access-Control-Allow-Method + Access-Control-Allow-Headers + Access-Control-Max-Age + + + + + + + + + + HTTP-ответ + Access-Control-Allow-Origin + + + + если сервер разрешил: onload + иначе onerror + + + + + Основной HTTP-запрос + Origin + + + + \ No newline at end of file diff --git a/5-animation/1-bezier/bezier-car.svg b/5-animation/1-bezier/bezier-car.svg index 5251d0b6..58061706 100644 --- a/5-animation/1-bezier/bezier-car.svg +++ b/5-animation/1-bezier/bezier-car.svg @@ -1 +1,32 @@ -bezier-car.svgCreated with bin/sketchtool. \ No newline at end of file + + + + bezier-car.svg + Created with bin/sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/5-animation/1-bezier/bezier-letter.svg b/5-animation/1-bezier/bezier-letter.svg index 5f4779ce..58e3fbfd 100644 --- a/5-animation/1-bezier/bezier-letter.svg +++ b/5-animation/1-bezier/bezier-letter.svg @@ -1 +1,50 @@ -bezier-letter.svgCreated with bin/sketchtool. \ No newline at end of file + + + + bezier-letter.svg + Created with bin/sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/5-animation/1-bezier/bezier-vase.svg b/5-animation/1-bezier/bezier-vase.svg index e0dcd149..6030a745 100644 --- a/5-animation/1-bezier/bezier-vase.svg +++ b/5-animation/1-bezier/bezier-vase.svg @@ -1 +1,49 @@ -bezier-vase.svgCreated with bin/sketchtool. \ No newline at end of file + + + + bezier-vase.svg + Created with bin/sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/5-animation/1-bezier/bezier2.svg b/5-animation/1-bezier/bezier2.svg index 5b7250d9..0b0f99a6 100644 --- a/5-animation/1-bezier/bezier2.svg +++ b/5-animation/1-bezier/bezier2.svg @@ -1 +1,20 @@ -bezier2.svgCreated with bin/sketchtool.12 \ No newline at end of file + + + + bezier2.svg + Created with bin/sketchtool. + + + + + + + 1 + + + + 2 + + + + \ No newline at end of file diff --git a/5-animation/1-bezier/bezier3-draw1.svg b/5-animation/1-bezier/bezier3-draw1.svg index 6fe02a19..9051e0ca 100644 --- a/5-animation/1-bezier/bezier3-draw1.svg +++ b/5-animation/1-bezier/bezier3-draw1.svg @@ -1 +1,37 @@ -bezier3-draw1.svgCreated with bin/sketchtool.1320.25t = 0.250.25 \ No newline at end of file + + + + bezier3-draw1.svg + Created with bin/sketchtool. + + + + + + + + 1 + + + + 3 + + + + + 2 + + + 0.25 + + + t = 0.25 + + + 0.25 + + + + + + \ No newline at end of file diff --git a/5-animation/1-bezier/bezier3-draw2.svg b/5-animation/1-bezier/bezier3-draw2.svg index 47745774..dd762b32 100644 --- a/5-animation/1-bezier/bezier3-draw2.svg +++ b/5-animation/1-bezier/bezier3-draw2.svg @@ -1 +1,38 @@ -bezier3-draw2.svgCreated with bin/sketchtool.1320.5t = 0.50.5 \ No newline at end of file + + + + bezier3-draw2.svg + Created with bin/sketchtool. + + + + + + + + + 1 + + + + 3 + + + + + + 2 + + + 0.5 + + + t = 0.5 + + + 0.5 + + + + + \ No newline at end of file diff --git a/5-animation/1-bezier/bezier3-e.svg b/5-animation/1-bezier/bezier3-e.svg index 1ddae51c..79e31532 100644 --- a/5-animation/1-bezier/bezier3-e.svg +++ b/5-animation/1-bezier/bezier3-e.svg @@ -1 +1,25 @@ -bezier3-e.svgCreated with bin/sketchtool.133 \ No newline at end of file + + + + bezier3-e.svg + Created with bin/sketchtool. + + + + + + + + 1 + + + + 3 + + + + 3 + + + + \ No newline at end of file diff --git a/5-animation/1-bezier/bezier3.svg b/5-animation/1-bezier/bezier3.svg index 8d3aa43a..5ac329b5 100644 --- a/5-animation/1-bezier/bezier3.svg +++ b/5-animation/1-bezier/bezier3.svg @@ -1 +1,24 @@ -bezier3.svgCreated with bin/sketchtool.133 \ No newline at end of file + + + + bezier3.svg + Created with bin/sketchtool. + + + + + + + 1 + + + + 3 + + + + 3 + + + + \ No newline at end of file diff --git a/5-animation/1-bezier/bezier4-e.svg b/5-animation/1-bezier/bezier4-e.svg index 1509c0b7..562d06c6 100644 --- a/5-animation/1-bezier/bezier4-e.svg +++ b/5-animation/1-bezier/bezier4-e.svg @@ -1 +1,29 @@ -bezier4-e.svgCreated with bin/sketchtool.1234 \ No newline at end of file + + + + bezier4-e.svg + Created with bin/sketchtool. + + + + + + + + + + + 1 + + + 2 + + + 3 + + + 4 + + + + \ No newline at end of file diff --git a/5-animation/1-bezier/bezier4.svg b/5-animation/1-bezier/bezier4.svg index 6fe66dc0..f60ba3e5 100644 --- a/5-animation/1-bezier/bezier4.svg +++ b/5-animation/1-bezier/bezier4.svg @@ -1 +1,28 @@ -bezier4.svgCreated with bin/sketchtool.1234 \ No newline at end of file + + + + bezier4.svg + Created with bin/sketchtool. + + + + + + + + + + 1 + + + 2 + + + 3 + + + 4 + + + + \ No newline at end of file diff --git a/5-animation/2-css-transitions/bezier-train-over.svg b/5-animation/2-css-transitions/bezier-train-over.svg index 10c357dc..696c5fc3 100644 --- a/5-animation/2-css-transitions/bezier-train-over.svg +++ b/5-animation/2-css-transitions/bezier-train-over.svg @@ -1 +1,45 @@ -bezier-train-over.svgCreated with bin/sketchtool.(1,1)(0,0)(0,1)(1,0)1243 \ No newline at end of file + + + + bezier-train-over.svg + Created with bin/sketchtool. + + + + + + + (1,1) + + + (0,0) + + + (0,1) + + + (1,0) + + + + + + + 1 + + + + 2 + + + + + 4 + + + + 3 + + + + \ No newline at end of file diff --git a/5-animation/2-css-transitions/ease-in-out.svg b/5-animation/2-css-transitions/ease-in-out.svg index c708f3a3..55c0dbee 100644 --- a/5-animation/2-css-transitions/ease-in-out.svg +++ b/5-animation/2-css-transitions/ease-in-out.svg @@ -1 +1,30 @@ -ease-in-out.svgCreated with bin/sketchtool.1234 \ No newline at end of file + + + + ease-in-out.svg + Created with bin/sketchtool. + + + + + + + + + + + + 1 + + + 2 + + + 3 + + + 4 + + + + \ No newline at end of file diff --git a/5-animation/2-css-transitions/train-curve.svg b/5-animation/2-css-transitions/train-curve.svg index 1e8c8ec1..76acd7e6 100644 --- a/5-animation/2-css-transitions/train-curve.svg +++ b/5-animation/2-css-transitions/train-curve.svg @@ -1 +1,30 @@ -train-curve.svgCreated with bin/sketchtool.1243 \ No newline at end of file + + + + train-curve.svg + Created with bin/sketchtool. + + + + + + + + 1 + + + + 2 + + + + + 4 + + + + 3 + + + + \ No newline at end of file diff --git a/5-animation/3-js-animation/back.svg b/5-animation/3-js-animation/back.svg index cc9ccde5..462e7317 100644 --- a/5-animation/3-js-animation/back.svg +++ b/5-animation/3-js-animation/back.svg @@ -1 +1,25 @@ -back.svgCreated with bin/sketchtool.011 \ No newline at end of file + + + + back.svg + Created with bin/sketchtool. + + + + + + + + + + 0 + + + 1 + + + 1 + + + + \ No newline at end of file diff --git a/5-animation/3-js-animation/bounce-inout.svg b/5-animation/3-js-animation/bounce-inout.svg index 03ecd397..72befffd 100644 --- a/5-animation/3-js-animation/bounce-inout.svg +++ b/5-animation/3-js-animation/bounce-inout.svg @@ -1 +1,26 @@ -bounce-inout.svgCreated with bin/sketchtool.011 \ No newline at end of file + + + + bounce-inout.svg + Created with bin/sketchtool. + + + + + + + + + + 0 + + + 1 + + + 1 + + + + + \ No newline at end of file diff --git a/5-animation/3-js-animation/circ-ease.svg b/5-animation/3-js-animation/circ-ease.svg index a11fedef..df183f8b 100644 --- a/5-animation/3-js-animation/circ-ease.svg +++ b/5-animation/3-js-animation/circ-ease.svg @@ -1 +1,27 @@ -circ-ease.svgCreated with bin/sketchtool.011 \ No newline at end of file + + + + circ-ease.svg + Created with bin/sketchtool. + + + + + + + + + + + 0 + + + 1 + + + 1 + + + + + \ No newline at end of file diff --git a/5-animation/3-js-animation/circ.svg b/5-animation/3-js-animation/circ.svg index d0233f89..1e05644a 100644 --- a/5-animation/3-js-animation/circ.svg +++ b/5-animation/3-js-animation/circ.svg @@ -1 +1,25 @@ -circ.svgCreated with bin/sketchtool.011 \ No newline at end of file + + + + circ.svg + Created with bin/sketchtool. + + + + + + + + + + 0 + + + 1 + + + 1 + + + + \ No newline at end of file diff --git a/5-animation/3-js-animation/elastic.svg b/5-animation/3-js-animation/elastic.svg index ff4451f7..0cf307cb 100644 --- a/5-animation/3-js-animation/elastic.svg +++ b/5-animation/3-js-animation/elastic.svg @@ -1 +1,25 @@ -elastic.svgCreated with bin/sketchtool.011 \ No newline at end of file + + + + elastic.svg + Created with bin/sketchtool. + + + + + + + + + + 0 + + + 1 + + + 1 + + + + \ No newline at end of file diff --git a/5-animation/3-js-animation/linear.svg b/5-animation/3-js-animation/linear.svg index dedfacda..6d8c4208 100644 --- a/5-animation/3-js-animation/linear.svg +++ b/5-animation/3-js-animation/linear.svg @@ -1 +1,25 @@ -linear.svgCreated with bin/sketchtool.011 \ No newline at end of file + + + + linear.svg + Created with bin/sketchtool. + + + + + + + + + + 0 + + + 1 + + + 1 + + + + \ No newline at end of file diff --git a/5-animation/3-js-animation/quad.svg b/5-animation/3-js-animation/quad.svg index 9ba9fb9f..4c06185b 100644 --- a/5-animation/3-js-animation/quad.svg +++ b/5-animation/3-js-animation/quad.svg @@ -1 +1,25 @@ -quad.svgCreated with bin/sketchtool.011 \ No newline at end of file + + + + quad.svg + Created with bin/sketchtool. + + + + + + + + + + 0 + + + 1 + + + 1 + + + + \ No newline at end of file diff --git a/5-animation/3-js-animation/quint.svg b/5-animation/3-js-animation/quint.svg index 75cc16c3..44f6fcc7 100644 --- a/5-animation/3-js-animation/quint.svg +++ b/5-animation/3-js-animation/quint.svg @@ -1 +1,25 @@ -quint.svgCreated with bin/sketchtool.011 \ No newline at end of file + + + + quint.svg + Created with bin/sketchtool. + + + + + + + + + + 0 + + + 1 + + + 1 + + + + \ No newline at end of file diff --git a/figures.sketch b/figures.sketch index 8a068553..9b0b2a8f 100644 Binary files a/figures.sketch and b/figures.sketch differ