Совпадение строки, которая позволяет экранировать, не так сложно.
Смотрите здесь: http://ad.hominem.org/log/2005/05/quoted_strings.php.
Для простоты я выбрал подход, в котором строка делится на два «атома»: либо символ, который не является «кавычкой или обратной косой чертой», либо обратный слеш, за которым следует любой символ.
"(([^"\\]|\\.)*)"
Очевидное улучшение теперь в том, чтобы разрешить разные цитаты и использовать обратную ссылку.
(["'])((\\.|[^\1\\])*?)\1
Также множественные обратные слеши интерпретируются правильно.
Теперь перейдем к той части, где это становится странным: мне нужно проанализировать некоторые переменные, подобные этой (обратите внимание на отсутствующую обратную косую черту в первом значении переменной):
test = 'foo'bar'
var = 'lol'
int = 7
Так что я написал довольно выражение. Я обнаружил, что следующая часть не работает должным образом (единственное отличие от приведенного выше выражения заключается в добавлении "([\ r \ n] +)"):
(["'])((\\.|[^\1\\])*?)\1([\r\n]+)
Несмотря на отсутствие обратной косой черты, 'foo'bar' соответствует. Я использовал RegExr от gskinner для этого (онлайн-инструмент), но PHP (PCRE) ведет себя так же.
Чтобы это исправить, вы можете жестко закодировать цитату, заменив обратные ссылки на '. Тогда это работает как ожидалось.
Означает ли это, что обратная ссылка на самом деле не работает в этом случае? И какое это имеет отношение к символам перевода строки, без них это работало?