Как сопоставить строку в кавычках с экранированными кавычками? - PullRequest
2 голосов
/ 30 августа 2009
/^"((?:[^"]|\\.)*)"/

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

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

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

Ответы [ 3 ]

4 голосов
/ 30 августа 2009

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

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

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

0 голосов
/ 30 августа 2009

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

.
/('|").*\\\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\"'
0 голосов
/ 30 августа 2009

Использование 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"; Я полагаю, что в вашей версии (которая также преждевременно прерывает совпадение, если подставить ее здесь), подвыражение «не двойная кавычка» ([^"]) поглощает обратные слеши, которые вы намереваетесь использовать как экранирование следующих за ним символов. Все, что я делаю здесь - это гарантирую, что такие обратные слеши НЕ будут проглочены таким образом, и, как я уже сказал, похоже, это работает с этим изменением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...