/^"((?:[^"]|\\.)*)"/
Против этой строки:
"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\"'