назад до уроку

Знайдіть рядки у лапках

Створіть регулярний вираз для пошуку рядків у подвійних лапках "...".

Рядки повинні підтримувати екранування за допомогою зворотнього слеша, аналогічно з рядками в JavaScript. Наприклад, лапки можуть бути вставлені як \", новий рядок як \n, та сам зворотній слеш як \\.

let str = "Як ось \"тут\".";

Зокрема, зверніть увагу, що екрановані лапки \" не завершують рядок.

Тому нам необхідно шукати від одних лапок до інших, ігноруючи екрановані лапки на нашому шляху.

У цьому і полягає основна складність завдання, адже без цієї умови – рішення було б елементарним.

Приклади відповідних рядків:

.. "test me" ..
.. "Скажи \"Привіт\"!" ... (екрановані рядки всередині)
.. "\\" ..  (подвійний слеш всередині)
.. "\\ \"" ..  (подвійний слеш та екрановані лапки всередині)

У JavaScript нам потрібно подвоювати слеші, щоб передати їх в рядок, як тут:

let str = ' .. "протестуй мене" .. "Скажи \\"Привіт\\"!" .. "\\\\ \\"" .. ';

// Рядок у пам’яті
alert(str); //  .. "протестуй мене" .. "Скажи \"Привіт\"!" .. "\\ \"" ..

Рішення: /"(\\.|[^"\\])*"/g.

Крок за кроком:

  • Спочатку шукаємо відкриваючі лапки "
  • Потім, якщо є зворотній слеш \\ (ми повинні подвоїти його у виразі, тому що це спеціальний символ), то після нього також підійде будь-який символ (крапка).
  • В іншому випадку, беремо будь-який символ, крім лапок (це означало б кінець рядка) та зворотнього слешу (щоб запобігти поодиноким зворотнім слешам, бо вони використовуються тільки з іншими символами після них): [^"\\]
  • …І так далі, до закриваючих лапок.

У дії:

let regexp = /"(\\.|[^"\\])*"/g;
let str = ' .. "протестуй мене" .. "Скажи \\"Привіт\\"!" .. "\\\\ \\"" .. ';

alert( str.match(regexp) ); // "протестуй мене","Скажи \"Привіт\"!","\\ \""