Знайдіть рядки у лапках
Створіть регулярний вираз для пошуку рядків у подвійних лапках "..."
.
Рядки повинні підтримувати екранування за допомогою зворотнього слеша, аналогічно з рядками в JavaScript. Наприклад, лапки можуть бути вставлені як \"
, новий рядок як \n
, та сам зворотній слеш як \\
.
let str = "Як ось \"тут\".";
Зокрема, зверніть увагу, що екрановані лапки \"
не завершують рядок.
Тому нам необхідно шукати від одних лапок до інших, ігноруючи екрановані лапки на нашому шляху.
У цьому і полягає основна складність завдання, адже без цієї умови – рішення було б елементарним.
Приклади відповідних рядків:
.. "test me" ..
.. "Скажи \"Привіт\"!" ... (екрановані рядки всередині)
.. "\\" .. (подвійний слеш всередині)
.. "\\ \"" .. (подвійний слеш та екрановані лапки всередині)
У JavaScript нам потрібно подвоювати слеші, щоб передати їх в рядок, як тут:
let str = ' .. "протестуй мене" .. "Скажи \\"Привіт\\"!" .. "\\\\ \\"" .. ';
// Рядок у пам’яті
alert(str); // .. "протестуй мене" .. "Скажи \"Привіт\"!" .. "\\ \"" ..
Рішення: /"(\\.|[^"\\])*"/g
.
Крок за кроком:
- Спочатку шукаємо відкриваючі лапки
"
- Потім, якщо є зворотній слеш
\\
(ми повинні подвоїти його у виразі, тому що це спеціальний символ), то після нього також підійде будь-який символ (крапка). - В іншому випадку, беремо будь-який символ, крім лапок (це означало б кінець рядка) та зворотнього слешу (щоб запобігти поодиноким зворотнім слешам, бо вони використовуються тільки з іншими символами після них):
[^"\\]
- …І так далі, до закриваючих лапок.
У дії:
let regexp = /"(\\.|[^"\\])*"/g;
let str = ' .. "протестуй мене" .. "Скажи \\"Привіт\\"!" .. "\\\\ \\"" .. ';
alert( str.match(regexp) ); // "протестуй мене","Скажи \"Привіт\"!","\\ \""