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

时间:2015-01-31 03:50:56

标签: c++ c regex flex-lexer lex

我看这里ANSI C grammar

此页面包含Lex / Flex for ANSI C中的许多正则表达式。

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

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

我理解\"这用于双引号,\\用于转义字符,.适用于除escape character*之外的任何字符是零次或多次。

[^\\"]表示除\"以外的字符。

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

你能给出一些字符串,其中正则表达式会失败吗?

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

1 个答案:

答案 0 :(得分:5)

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

"\z\x\p\r"

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

"hello"

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

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

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