PCRE, 21 20 15 19 bayt
(.|^)"\K(\\.|[^"])*
Burada deneyin.
Bu, çift çift tırnak işareti başlamadan önce bir karakterle (veya girişin başlangıcıyla) eşleşir ve ardından çift tırnak işareti başka bir eşleşmeyle paylaşılmadığından emin olmak için eşleşmeyi sıfırlar.
PCRE, 25 23 bayt
2 bayt golf oynadığı için Martin Büttner'a teşekkürler.
(\\.|[^"])*+(?!"(?R)|$)
Burada deneyin.
açıklama
(
\\.|[^"] # 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.
Sahip olunan nicelik belirtecinin ( *+
), her zaman bir dizgiden ya da dizgisiz bir parçanın tamamından sonra negatif görünümün başlamasını sağladığını unutmayın .
4 vaka var:
- Eşleşme bir dizenin dışında herhangi bir yerde başlar.
\\.
açıklamaya göre asla çift tırnak ile eşleşmez. Bir dizgiyi başlatan bir sonraki çift tırnaktan veya girdinin bitiminden hemen önce sona erebilir. Her iki dava da negatif ileriye doğru başarısız oluyor.
- Maç bir dizenin başında başlar.
(\\.|[^"])*+
tam bir dizeyle eşleşir. Bir sonraki karakter çift tırnak olmalı ve girişin sonu olamaz. Çift alıntıdan sonra dize dışında, bu yüzden başka bir eşleşme olamazdı. Böylece negatif ileriye doğru geçer.
- Maç bir dizenin sonunda başlar. Boş bir dize ile önceki durumla aynı şekilde eşleşir. Ancak açıklamaya göre önemli değil.
- Maç bir dizenin ortasında başlar. İmkansız çünkü maçlar çakışmıyor.
\
Bir dizeden önce olacak mı? Örneğinabc\"def"
.