Lex/Flex:C/C++ 中字符串文字的正则表达式?

Lex/Flex :Regular expression for string literals in C/C++?

我看这里ANSI C grammar .

此页面包含大量 Lex/Flex ANSI C 正则表达式。

在理解字符串文字的正则表达式时遇到问题。

他们提到正则表达式为 \"(\.|[^\"])*\"

据我了解\"这是用于双引号,\用于转义字符,.用于除escape character和[=17之外的任何字符=] 表示零次或多次。

[^\"] 表示除 \" .

之外的字符

所以,在我看来,正则表达式应该是\"(\.)*\"

你能给出一些上面的正则表达式会失败的字符串吗?

为什么他们用了[^\"]

您建议的正则表达式 \"(\.)*\" 匹配由 \ 符号与任何字符交替组成的字符串,例如:

"\z\x\p\r"

因此,此正则表达式无法匹配如下字符串:

"hello"

字符串 "hello" 将与正则表达式 \".*\" 匹配,但它也将匹配字符串 """""\",两者均无效。

为了摆脱这些无效的匹配,我们可以使用 \"[^\"]*\",但是现在这将无法匹配像 "\a\a\a" 这样的字符串,这是一个有效的字符串。

我们看到 \"(\.)*\" 确实匹配这个字符串,所以我们需要做的就是将这两个组合起来得到 \"(\.|[^\"])*\".