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

8

我在这里看 ANSI C语法

这个页面包含了许多用于ANSI C的Lex/Flex的正则表达式。

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

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

据我所知,\"用于表示双引号,\\代表转义字符,.代表除了转义字符之外的任何字符,*表示出现零次或多次。

[^\\"]表示除了\"之外的所有字符。

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

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

或者

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


如果您使用 " 作为分隔符,则 \\. 将匹配一个字面上的点,而不是反斜杠和点。 - Avinash Raj
1个回答

5
你提出的正则表达式\"(\\.)*\"匹配由\符号与任何字符交替出现的字符串,例如:
"\z\x\p\r"

这个正则表达式将无法匹配像这样的字符串:
"hello"

字符串"hello"将被正则表达式\".*\"匹配,但这也会匹配无效的字符串"""""\"。为了摆脱这些无效的匹配,我们可以使用\"[^\\"]*\",但这将无法匹配像"\a\a\a"这样的有效字符串。正如我们所看到的,\"(\\.)*\"确实匹配此字符串,因此我们需要将它们组合起来得到\"(\\.|[^\\"])*\"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接