我看这里ANSI C grammar。
此页面包含Lex / Flex for ANSI C中的许多正则表达式。
在理解字符串文字的正则表达式时遇到问题。
他们提到正则表达为\"(\\.|[^\\"])*\"
我理解\"
这用于双引号,\\
用于转义字符,.
适用于除escape character
和*
之外的任何字符是零次或多次。
[^\\"]
表示除\
,"
以外的字符。
所以,在我看来,正则表达式应该是\"(\\.)*\"
。
你能给出一些字符串,其中正则表达式会失败吗?
或
为什么他们使用了[^\\"]
?
答案 0 :(得分:5)
您建议的正则表达式\"(\\.)*\"
会匹配由\
个符号组成的字符串,并与以下任何字符交替:
"\z\x\p\r"
因此,这个正则表达式无法匹配如下字符串:
"hello"
字符串"hello"
将与正则表达式\".*\"
匹配,但这也会匹配字符串""""
或"\"
,两者都无效。
为了摆脱这些无效的匹配,我们可以使用\"[^\\"]*\"
,但现在这将无法匹配像"\a\a\a"
这样的字符串,这是一个有效的字符串。
我们看到\"(\\.)*\"
确实与此字符串匹配,因此我们需要做的就是将这两者结合起来以获得\"(\\.|[^\\"])*\"
。