Как сопоставить строку с кавычками в кавычках?

/^"((?:[^"]|\\.)*)"/ 

Против этой строки:

 "quote\_with\\escaped\"characters" more 

Он соответствует только \" , хотя я четко определил \ как escape-символ (и он соответствует \_ и \\ штраф …).

Он работает правильно, если вы переверните порядок своих двух альтернатив:

 /^"((?:\\.|[^"])*)"/ 

Проблема в том, что в противном случае важный \ характер съедается до того, как он попытается сопоставить \" . Он работал раньше для \\ и \_ только потому, что оба символа в каждой из пар совпадают с вашим [^"] .

Используя Python с литералами с исходной строкой, чтобы обеспечить дальнейшую интерпретацию escape-последовательностей, выполняется следующий вариант:

 import re x = re.compile(r'^"((?:[^"\\]|\\.)*)"') s = r'"quote\_with\\escaped\"characters" more"' mo = x.match(s) print mo.group() 

испускает "quote\_with\\escaped\"characters" ; я полагаю, что в вашей версии (которая также прерывает матч в ранней стадии, если она была заменена здесь) подвыражение« не двойное »( [^"] ) проглатывает обратные косые черты, которые вы намереваются принять за то, чтобы избегать сразу следующих символов. Все, что я здесь делаю, – это обеспечение того, чтобы такие обратные слэши НЕ проглатывались таким образом, и, как я уже сказал, это похоже на работу с этим изменением.

Не собирайтесь запутывать, просто еще одну информацию, с которой я играл. Ниже regexp (PCRE) попытайтесь не соответствовать неправильному синтаксису (например, end with \ ") и можете использовать как с" или "

 /('|").*\\\1.*?[^\\]\1/ 

использовать с php

 <?php if (preg_match('/(\'|").*\\\\\1.*?[^\\\\]\1/', $subject)) return true; ?> 

Для:

 "quote\_with\\escaped\"characters" "aaa" 'just \'another\' quote "example\"' "Wrong syntax \" "No escapes, no match here" 

Это единственное совпадение:

 "quote\_with\\escaped\"characters" and 'just \'another\' quote "example\"'