diff --git a/9-regular-expressions/13-regexp-alternation/03-match-quoted-string/solution.md b/9-regular-expressions/13-regexp-alternation/03-match-quoted-string/solution.md index f74041cb26..ea57cf1ab1 100644 --- a/9-regular-expressions/13-regexp-alternation/03-match-quoted-string/solution.md +++ b/9-regular-expressions/13-regexp-alternation/03-match-quoted-string/solution.md @@ -11,7 +11,10 @@ ```js run let regexp = /"(\\.|[^"\\])*"/g; -let str = ' .. "test me" .. "Скажи \\"Привет\\"!" .. "\\\\ \\"" .. '; -alert( str.match(regexp) ); // "test me","Скажи \"Привет\"!","\\ \"" +let str1 = ' .. "test me" .. "Скажи \\"Привет\\"!" .. ' +let str2 = ' .. \\" ^_^ " .. "\\\\ \\"" .. '; + +alert( str1.match(regexp) ); // "test me", "Скажи \"Привет\"!" +alert( str2.match(regexp) ); // " ^_^ ", "\\ \"" ``` diff --git a/9-regular-expressions/13-regexp-alternation/03-match-quoted-string/task.md b/9-regular-expressions/13-regexp-alternation/03-match-quoted-string/task.md index 0d28a3566a..99afb35d92 100644 --- a/9-regular-expressions/13-regexp-alternation/03-match-quoted-string/task.md +++ b/9-regular-expressions/13-regexp-alternation/03-match-quoted-string/task.md @@ -7,10 +7,16 @@ ```js let str = "Как вот \"здесь\"."; ``` +Причём экранирование работает только внутри строк. -В частности, обратите внимание: двойная кавычка после обратного слеша `subject:\"` не оканчивает строку. +Поэтому двойная кавычка после обратного слеша `subject:\"` не оканчивает строку, но может начинать её: -Поэтому мы должны искать от одной кавычки до другой, игнорируя встречающиеся экранированные кавычки. +```js +..\*!*"Строка1"*/!* aaa \*!*"Строка2"*/!*.. // Верно +..\"Строка1*!*" aaa \"Строка2"*/!*.. // Неверно +``` + +Следовательно, мы должны искать от одной кавычки до другой, игнорируя встречающиеся между ними экранированные кавычки. В этом и состоит основная сложность задачи, которая без этого условия была бы элементарной. @@ -18,15 +24,17 @@ let str = "Как вот \"здесь\"."; ```js .. *!*"test me"*/!* .. .. *!*"Скажи \"Привет\"!"*/!* ... (строка с экранированными кавычками) -.. *!*"\\"*/!* .. (внутри двойной слеш) -.. *!*"\\ \""*/!* .. (внутри двойной слеш и экранированная кавычка) +..\*!*" ^_^ "*/!* .. (вне строк экранирование не работает) +.. *!*"\\ \""*/!* .. (внутри двойной слеш и экранированная кавычка) ``` В JavaScript приходится удваивать обратные слеши, чтобы добавлять их в строку, как здесь: ```js run -let str = ' .. "test me" .. "Скажи \\"Привет\\"!" .. "\\\\ \\"" .. '; +let str1 = ' .. "test me" .. "Скажи \\"Привет\\"!" .. '; +let str2 = ' .. \\" ^_^ " .. "\\\\ \\"" .. '; -// эта строка в памяти: -alert(str); // .. "test me" .. "Скажи \"Привет\"!" .. "\\ \"" .. +// эти строки в памяти: +alert(str1); // .. "test me" .. "Скажи \"Привет\"!" .. +alert(str2); // .. \" ^_^ " .. "\\ \"" .. ```