Вы можете использовать положительный вид сзади:
/\A"((?<=\\)"|[^"])*"\z/
Это именно то, что вы просили: «если двойная кавычка появляется во внешних двойных кавычках без префикса обратной косой черты, она не't match. "
Некоторые комментарии:
\A
, \z
: Они совпадают только в начале и конце строка.Таким образом, шаблон должен соответствовать строке целом , а не ее части.(?<=)
: это синтаксис для позитивного взгляда сзади;он утверждает, что шаблон должен соответствовать непосредственно перед текущей позицией.Таким образом, (?<=\\)"
соответствует «двойной кавычке, которой предшествует обратный слеш».[^"]
: Это соответствует «любому символу, который не является обратной косой чертой».
Одно замечание об этом регулярном выражении, это то, что будет соответствовать внутренней двойной кавычке, которой предшествует две обратных косых черты.Если это проблема, оставьте комментарий, и я исправлю его.
Если ваша версия Ruby не имеет вид сзади, вы можете сделать что-то вроде:
/\A"(\\.|[^"\\])*"\z/
Обратите внимание, что в отличие от первого регулярного выражения, этот не учитывает двойной обратный слеш как экранирующий кавычку (скорее, первый обратный слэш экранирует второй), поэтому "\\""
не будет совпадать.