diff --git a/11-regular-expressions-javascript/12-regexp-alternation/1-find-programming-language/solution.md b/11-regular-expressions-javascript/12-regexp-alternation/1-find-programming-language/solution.md new file mode 100644 index 00000000..b02bec16 --- /dev/null +++ b/11-regular-expressions-javascript/12-regexp-alternation/1-find-programming-language/solution.md @@ -0,0 +1,36 @@ +Сначала неправильный способ. + +Если перечислить языки один за другим через `|`, то получится совсем не то: + +```js +//+ run +var reg = /Java|JavaScript|PHP|C|C\+\+/g; + +var str = "Java, JavaScript, PHP, C, C++"; + +alert( str.match(reg) ); // Java,Java,PHP,C,C +``` + +Как видно, движок регулярных выражений ищет альтернации в порядке их перечисления. То есть, он сначала смотрит, есть ли Java, а если нет -- ищет JavaScript. + +Естественно, при этом JavaScript не будет найдено никогда. + +То же самое -- с C и C++. + +Есть два решения проблемы: + +
    +
  1. Поменять порядок, чтобы более длинное совпадение проверялось первым: JavaScript|Java|C\+\+|C|PHP.
  2. +
  3. Соединить длинный вариант с коротким: Java(Script)?|C(\+\+)?|PHP.
  4. +
+ +В действии: + +```js +//+ run +var reg = /Java(Script)?|C(\+\+)?|PHP/g; + +var str = "Java, JavaScript, PHP, C, C++"; + +alert( str.match(reg) ); // Java,JavaScript,PHP,C,C++ +``` diff --git a/11-regular-expressions-javascript/12-regexp-alternation/1-find-programming-language/task.md b/11-regular-expressions-javascript/12-regexp-alternation/1-find-programming-language/task.md new file mode 100644 index 00000000..b93570f3 --- /dev/null +++ b/11-regular-expressions-javascript/12-regexp-alternation/1-find-programming-language/task.md @@ -0,0 +1,6 @@ +# Найдите языки программирования + +Существует много языков программирования, например Java, JavaScript, PHP, C, C++. + +Напишите регулярное выражение, которое найдёт их все в строке "Java JavaScript PHP C++ C" + diff --git a/11-regular-expressions-javascript/12-regexp-alternation/2-match-quoted-string/solution.md b/11-regular-expressions-javascript/12-regexp-alternation/2-match-quoted-string/solution.md new file mode 100644 index 00000000..5ff6e4fd --- /dev/null +++ b/11-regular-expressions-javascript/12-regexp-alternation/2-match-quoted-string/solution.md @@ -0,0 +1,19 @@ +Решение задачи: /"(\\.|[^"\\])*"/g. + +То есть: + + +В действии: + +```js +//+ run +var re = /"(\\.|[^"\\])*"/g; +var str = '.. "test me" .. "Скажи \\"Привет\\"!" .. "\\r\\n" ..'; + +alert( str.match(re) ); // "test me","Скажи \"Привет\"!","\r\n" +``` \ No newline at end of file diff --git a/11-regular-expressions-javascript/12-regexp-alternation/2-match-quoted-string/task.md b/11-regular-expressions-javascript/12-regexp-alternation/2-match-quoted-string/task.md new file mode 100644 index 00000000..33c4a94e --- /dev/null +++ b/11-regular-expressions-javascript/12-regexp-alternation/2-match-quoted-string/task.md @@ -0,0 +1,27 @@ +# Найдите строки в кавычках + +Найдите при помощи регэкспа строки в двойных кавычках "...". + +В строке *могут* быть любые символы, включая вложенные кавычки, заэкранированные слэшем, то есть: \", \n. Слэш удваивается, чтобы вставить его как символ: \\. + +Иначе говоря, синтаксис строки -- примерно соответствует используемому в JavaScript. Нужно такие строки найти. + +Пример совпадающих строк: +```js +var str = ' .. *!*"test me"*/!* .. '; + +var str = ' .. *!*"Скажи \\"Привет\\"!"*/!* ... '; + +var str = ' .. *!*"\\r\\n"*/!* .. '; +``` + +Слэши в этих строках удвоены по технической причине -- в JavaScript кавычки `'...'` считают слэш специальным символом и требуют его экранировать. + +Так что на самом деле, к примеру, в такой строке одинарные слэши: +```js +//+ run +var str = ' .. *!*"Скажи \\"Привет\\"!"*/!* ... '; + +alert(str); // .. "Скажи \"Привет\" ... +``` + diff --git a/11-regular-expressions-javascript/3-regexp-character-classes/article.md b/11-regular-expressions-javascript/3-regexp-character-classes/article.md index 79c3f6de..a271a575 100644 --- a/11-regular-expressions-javascript/3-regexp-character-classes/article.md +++ b/11-regular-expressions-javascript/3-regexp-character-classes/article.md @@ -41,9 +41,9 @@ alert( str.match(reg) ); // массив всех совпадений: 7,9,0,3, Наиболее часто используются:
-
`\d` (от английского "digit" - "цифра")
+
`\d` (от английского "digit" -- "цифра")
Цифра, символ от `0` до `9`.
-
`\s` (от английского "space" - "пробел")
+
`\s` (от английского "space" -- "пробел")
Пробельный символ, включая табы, переводы строки и т.п.
`\w` (от английского "word" -- "слово")
Символ "слова", а точнее -- буква латинского алфавита или цифра или подчёркивание `'_'`. Не-английские буквы не являются `\w`, то есть русская буква не подходит.
@@ -142,7 +142,7 @@ alert( str.replace(/\D/g, "") ); // 79031234567 ## Пробелы -- обычные символы -Заметим, что в регулярных выражениях пробел - такой же символ, как и другие. +Заметим, что в регулярных выражениях пробел -- такой же символ, как и другие. Обычно мы не обращаем внимание на пробелы. Для нашего взгляда строки 1-5 и 1 - 5 почти идентичны. diff --git a/11-regular-expressions-javascript/7-regexp-quantifiers/2-find-html-colors-6hex/solution.md b/11-regular-expressions-javascript/7-regexp-quantifiers/2-find-html-colors-6hex/solution.md index 97cd4508..09576d99 100644 --- a/11-regular-expressions-javascript/7-regexp-quantifiers/2-find-html-colors-6hex/solution.md +++ b/11-regular-expressions-javascript/7-regexp-quantifiers/2-find-html-colors-6hex/solution.md @@ -22,4 +22,13 @@ alert( str.match(re) ); // #121212,#AA00ef alert( "#12345678".match( /#[a-f0-9]{6}/gi ) ) // #12345678 ``` -Если это является проблемой, то ее можно решить чуть более сложным выражением. +Чтобы такого не было, можно добавить в конец `\b`: + +```js +//+ run +// цвет +alert( "#123456".match( /#[a-f0-9]{6}\b/gi ) ); // #123456 + +// не цвет +alert( "#12345678".match( /#[a-f0-9]{6}\b/gi ) ); // null +``` diff --git a/11-regular-expressions-javascript/9-regexp-groups/1-find-webcolor-3-or-6/solution.md b/11-regular-expressions-javascript/9-regexp-groups/1-find-webcolor-3-or-6/solution.md index 78bea60d..ece24fb8 100644 --- a/11-regular-expressions-javascript/9-regexp-groups/1-find-webcolor-3-or-6/solution.md +++ b/11-regular-expressions-javascript/9-regexp-groups/1-find-webcolor-3-or-6/solution.md @@ -1,4 +1,4 @@ -Регулярное выражение для поиска 3-значного цвета: /#[a-f0-9]{3}/i. +Регулярное выражение для поиска 3-значного цвета вида `#abc`: /#[a-f0-9]{3}/i. Нужно добавить ещё три символа, причём нужны именно три, четыре или семь символов не нужны. Эти три символа либо есть, либо нет. @@ -18,4 +18,13 @@ var str = "color: #3f3; background-color: #AA00ef; and: #abcd"; alert( str.match(re) ); // #3f3 #AA0ef #abc ``` +В последнем выражении #abcd было найдено совпадение #abc. Чтобы этого не происходило, добавим в конец \b: +```js +//+ run +var re = /#([a-f0-9]{3}){1,2}\b/gi; + +var str = "color: #3f3; background-color: #AA00ef; and: #abcd"; + +alert( str.match(re) ); // #3f3 #AA0ef +``` diff --git a/11-regular-expressions-javascript/9-regexp-groups/1-find-webcolor-3-or-6/task.md b/11-regular-expressions-javascript/9-regexp-groups/1-find-webcolor-3-or-6/task.md index 000555ac..419c0476 100644 --- a/11-regular-expressions-javascript/9-regexp-groups/1-find-webcolor-3-or-6/task.md +++ b/11-regular-expressions-javascript/9-regexp-groups/1-find-webcolor-3-or-6/task.md @@ -11,4 +11,4 @@ var str = "color: #3f3; background-color: #AA00ef; and: #abcd"; alert( str.match(re) ); // #3f3 #AA0ef ``` -P.S. Значения из четырёх и более букв, такие как `#abcd` мы в этой задаче также учитываем, но берём из них только необходимые для совпадения символы, то есть `#abc`. +P.S. Значения из любого другого количества букв, кроме 3 и 6, такие как `#abcd`, не должны подходить под регэксп. \ No newline at end of file