PCRE, 21 20 15 19 byte
(.|^)"\K(\\.|[^"])*
Hãy thử nó ở đây.
Điều này khớp với một ký tự (hoặc bắt đầu của đầu vào) trước khi trích dẫn kép bắt đầu và sau đó đặt lại trận đấu, để đảm bảo rằng trích dẫn kép không được chia sẻ với trận đấu khác.
PCRE, 25 23 byte
Cảm ơn Martin Büttner vì đã chơi golf 2 byte.
(\\.|[^"])*+(?!"(?R)|$)
Hãy thử nó ở đây.
Giải trình
(
\\.|[^"] # 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.
Lưu ý rằng bộ định lượng sở hữu ( *+
) đảm bảo giao diện phủ định luôn bắt đầu sau toàn bộ chuỗi hoặc toàn bộ phân đoạn không chuỗi.
Có 4 trường hợp:
- Trận đấu bắt đầu ở bất cứ đâu ngoài chuỗi.
\\.
sẽ không bao giờ khớp với một trích dẫn đôi theo sự làm rõ. Nó chỉ có thể kết thúc ngay trước trích dẫn kép tiếp theo bắt đầu một chuỗi hoặc kết thúc đầu vào. Cả hai trường hợp đều thất bại trong cái nhìn tiêu cực.
- Trận đấu bắt đầu ở đầu một chuỗi.
(\\.|[^"])*+
sẽ phù hợp với một chuỗi hoàn chỉnh. Ký tự tiếp theo phải là một trích dẫn kép và không thể là kết thúc của đầu vào. Sau trích dẫn kép, nó nằm ngoài chuỗi, vì vậy nó không thể là một kết hợp khác. Vì vậy, nó vượt qua cái nhìn tiêu cực.
- Trận đấu bắt đầu ở cuối chuỗi. Nó khớp với một chuỗi rỗng theo cách tương tự như trường hợp trước. Nhưng nó không quan trọng theo sự làm rõ.
- Trận đấu bắt đầu ở giữa một chuỗi. Không thể vì các trận đấu không trùng nhau.
\
trước một chuỗi? Ví dụabc\"def"
.