【问题标题】:Lex/Flex :Regular expression for string literals in C/C++?Lex/Flex:C/C++ 中字符串文字的正则表达式?
【发布时间】:2015-03-30 15:25:01
【问题描述】:

我看这里ANSI C grammar

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

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

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

据我所知,\" 用于双引号,\\ 用于转义字符,. 用于除escape character 之外的任何字符,* 用于零次或多次。

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

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

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

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

【问题讨论】:

  • 如果您有" 作为分隔符,那么\\. 将匹配文字点。不是反斜杠和点。

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


【解决方案1】:

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

"\z\x\p\r"

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

"hello"

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

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

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

【讨论】:

    猜你喜欢
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    相关资源
    最近更新 更多