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