regex: Как сопоставить экранированные строки в двойных кавычках? - PullRequest
1 голос
/ 13 марта 2012

У меня есть строки, такие как:

\"Some text inside here. And perhaps special chars including newlines...\" then more text (out here)

Как мне просто сопоставить и вернуть то, что находится между экранированными двойными кавычками, отбрасывая остальные?

Ответы [ 4 ]

3 голосов
/ 13 марта 2012

Вы не можете использовать этот шаблон:

    \".*\"

, поскольку "точка" не соответствует символу новой строки, если вы не используете флаг "s", который заставляет "точку" соответствовать всему (включая символ новой строки)

и даже больше этот шаблон не соответствует этому примеру:

    "this is a quoted text" and "this is another one"

шаблон выше будет соответствовать всей строке вместо двух цитируемых текстов. (поскольку. * является жадным и будет соответствовать самой длинной строке, в которой это возможно, в данном случае всей строке.) Вместо этого вы должны использовать. *? что делает шаблон "неохотным", и он будет соответствовать самой короткой из возможных строк.

, чтобы обернуть его, вы можете использовать этот шаблон с флагом "s" (dot-match-all):

    \".*?\"

или используйте это:

    \"[^"]\"

, для которого не требуется флаг "s". (поскольку [^ "] соответствует чему угодно, кроме", который включает в себя новую строку.)

(Я не знаком с синтаксисом PHP, поэтому вам следует позаботиться о применении флагов и экранировании символов самостоятельно.)

2 голосов
/ 13 марта 2012

Я предполагаю, что в строке есть только две экранированные двойные кавычки

match = s.match(/\\"(.*)\\"/m)
match[1] if match
1 голос
/ 13 марта 2012

Это должно хорошо работать для вас:

b'\\".*?\\"'
0 голосов
/ 13 марта 2012

Это можно сделать и без регулярных выражений:

$str = '\"Some text inside here. And perhaps special chars including newlines...\" then more text (out here)';

$out = explode('"', $str);

echo $out[0]; // outputs "\"
echo $out[1]; // outputs "Some text... ...\"
echo $out[2]; // outputs " then...here)"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...