PCRE, 21 20 15 19 байт
(.|^)"\K(\\.|[^"])*
Попробуй это здесь.
Это соответствует символу (или началу ввода) перед началом двойной кавычки, а затем сбрасывает совпадение, чтобы убедиться, что двойная кавычка не передана другому совпадению.
PCRE, 25 23 байта
Спасибо Мартину Бюттнеру за то, что он сыграл в гольф 2 байта.
(\\.|[^"])*+(?!"(?R)|$)
Попробуй это здесь.
объяснение
(
\\.|[^"] # An escaped character, or a character that isn't a double quote
)*+ # Possessive zero-or-more quantifier, which means backtracking
# could not happen after first match is found. That means if \\.
# matched, it would never switch to [^"], because it is always a
# match if it just stopped after the \\. without backtracking.
(?!"(?R)|$) # Make sure it is not followed by a double quote and another
# match, or the end of the input.
Обратите внимание, что притяжательный quantifier ( *+
) следит за тем, чтобы отрицательный прогноз всегда начинался после всей строки или целого сегмента, не являющегося строкой.
Есть 4 случая:
- Матч начинается за пределами строки.
\\.
никогда не будет соответствовать двойной кавычке в соответствии с разъяснениями. Он может закончиться только перед следующей двойной кавычкой, которая начинает строку или конец ввода. Оба случая терпят неудачу в негативной перспективе.
- Матч начинается в начале строки.
(\\.|[^"])*+
будет соответствовать полной строке. Следующий символ должен быть в двойной кавычке и не может быть концом ввода. После двойной кавычки он находится за пределами строки, поэтому он не может быть другим совпадением. Таким образом, он проходит негативную перспективу.
- Матч начинается в конце строки. Он соответствует пустой строке так же, как и в предыдущем случае. Но это не имеет значения согласно разъяснениям.
- Матч начинается в середине строки. Невозможно, потому что спички не перекрываются.
\
перед строкой? Напримерabc\"def"
.