Большинство предлагаемых решений используют альтернативные пути повторения, т. е. (A | B) *.
Вы можете столкнуться с переполнением стека на больших входах, поскольку какой-то компилятор шаблонов реализует это с помощью рекурсии.
Java, например: http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6337993
Что-то вроде этого: "(?:[^"\\]*(?:\\.)?)*"
или один предоставленный Гаем Бедфордом, уменьшит количество шагов синтаксического анализа, избегая большинства переполнений стека.