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