PCRE, 21 20 15 19 bytes
(.|^)"\K(\\.|[^"])*
Pruébalo aquí.
Esto coincide con un carácter (o el comienzo de la entrada) antes de la comilla doble inicial y luego restablece la coincidencia, para asegurarse de que la comilla doble no se comparta con otra coincidencia.
PCRE, 25 23 bytes
Gracias a Martin Büttner por jugar golf en 2 bytes.
(\\.|[^"])*+(?!"(?R)|$)
Pruébalo aquí.
Explicación
(
\\.|[^"] # 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.
Tenga en cuenta que el cuantificador posesivo ( *+
) se aseguró de que la búsqueda anticipada negativa siempre comience después de una cadena completa o un segmento completo de no cadena.
Hay 4 casos:
- El partido comienza en cualquier lugar fuera de una cadena.
\\.
nunca coincidiría con una comilla doble según la aclaración. Solo podría terminar justo antes de la próxima comilla doble que comienza una cadena, o el final de la entrada. Ambos casos falla la anticipación negativa.
- El partido comienza al comienzo de una cadena.
(\\.|[^"])*+
coincidiría con una cadena completa. El siguiente carácter debe ser una comilla doble y no puede ser el final de la entrada. Después de la comilla doble está fuera de la cadena, por lo que no podría ser otra coincidencia. Entonces pasa la mirada negativa hacia adelante.
- El partido comienza al final de una cadena. Coincide con una cadena vacía de la misma manera que el caso anterior. Pero no importa según la aclaración.
- El partido comienza en el medio de una cadena. Imposible porque los partidos no se superponen.
\
antes de una cadena? Por ejemploabc\"def"
.