Найдите строки в кавычках
Создайте регулярное выражение для поиска строк в двойных кавычках "..."
.
Важно, что строки должны поддерживать экранирование с помощью обратного слеша, по аналогии со строками 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","Скажи \"Привет\"!","\\ \""