如何匹配带引号的字符串中的转义引号?

时间:2009-08-30 00:12:32

标签: php regex

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

反对这个字符串:

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

它只匹配\",但我已明确将\定义为转义字符(并且它匹配\_\\很好......)。

3 个答案:

答案 0 :(得分:4)

如果你翻转两个选择的顺序,它可以正常工作:

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

问题是否则重要的\字符会在尝试匹配\"之前被吃掉。它之前适用于\\\_,因为任何一对中的两个字符都与[^"]匹配。

答案 1 :(得分:0)

将Python与原始字符串文字一起使用以确保不会对转义序列进行进一步解释,以下变体确实有效:

import re

x = re.compile(r'^"((?:[^"\\]|\\.)*)"')

s = r'"quote\_with\\escaped\"characters" more"'

mo = x.match(s)
print mo.group()

发出"quote\_with\\escaped\"characters";我相信在您的版本中(如果在此处替换也会早期中断匹配)“not a doublequote”子表达式([^"])正在吞咽您打算将其视为转义后续字符的反斜杠。我在这里所做的就是确保不会以这种方式吞下这样的反斜杠,正如我所说,这似乎与这种变化有关。

答案 2 :(得分:0)

不打算混淆,只是我玩过的另一个信息。在regexp(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\"'