2009-08-30 130 views
2
/^"((?:[^"]|\\.)*)"/ 

在此字符串:如何将带引号的字符串与转义引号匹配?

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

它只匹配,直到\",虽然我已经明确规定\作为转义字符(和它匹配\_\\精...)。

+2

难道还有比“什么是WRO更糟糕的问题与正则表达式?“ - 没有罪CX。 – Rob 2009-08-30 00:14:21

+0

我知道,对不对:D 你有什么标题? – 2009-08-30 00:20:07

+0

@Rob:这个问题的表述应该不同吗?或者,有关正则表达式的问题不像预期的那样不适合堆栈溢出? – 2009-08-30 00:20:55

回答

4

如果你翻车了你的两个备选方案的顺序是否能够正常工作:

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

的问题是,否则,重要的\字符被吃掉它试图匹配\"之前。它之前只适用于\\\_,因为两个字符都与您的[^"]匹配。

+0

简单的错误与事物的顺序,辉煌。谢谢! – 2009-08-30 00:41:07

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";我相信在你的版本中(如果在这里取代它,也会早早打断这场比赛),“不是双引号”的子表达式([^"])正在吞噬你打算被视为逃避紧随其后的角色的反斜杠。我在这里所做的只是确保这样的反斜杠不会被这种方式吞噬,正如我所说的那样,它似乎适用于这种变化。

0

不打算混淆,只是我玩过的另一个信息。下面的正则表达式(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\"' 
相关问题