首页 > 解决方案 > 如何理解 flex C/C++ 字符串文字正则表达式?

问题描述

我正在学习用于解析技术的 flex/bison。Book flex & bison展示了这样一个 flex 示例:


UCN (\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8})

{%
...
%}

%%

\"([^\"\\]|\\['"?\\abfnrtv]|\\[0-7]{1,3}|\\[Xx][0-9a-fA-F]+|{UCN})+\" { ... save token here }

%%

我不知道正则表达式中的这些部分:

  1. 是否[^\"\\]意味着不匹配\"\\?如果是这样,为什么需要指定这个不匹配?因为\"并且\\似乎没有出现在另一组中。
  2. 是什么\\[0-7]{1,3}意思?
  3. 是什么\\[Xx][0-9a-fA-F]意思?
  4. UCN是 utf-8 的意思吗?

标签: c++cregexflex-lexerlex

解决方案


该正则表达式匹配以下内容:

  • 一个"性格,
  • 后跟以下一项或多项的任意组合:
    • [^\"\\]"- 除或以外的任何字符\
    • \\['"?\\abfnrtv]- A\后跟', ", ?, \, a, b, f, n, r, t, 或v.
    • \\[0-7]{1,3}- A\后跟一到三个八进制数字。
    • \\[Xx][0-9a-fA-F]+- A\后跟Xx后跟一个或多个十六进制数字。
    • {UCN}, 扩展为(\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8})- 以下任一项:
      • \\u[0-9a-fA-F]{4}- A\后跟u四个十六进制数字
      • \\U[0-9a-fA-F]{8}- A\后跟U八个十六进制数字
  • 后跟一个结束"字符

请注意,这实际上不是匹配所有 C++ 字符串文字的正确模式,因为

  • ""它与空字符串 ( )不匹配
  • 十六进制转义码必须以小写字母开头x。匹配这些的更好模式是\\x[0-9a-fA-F]+

有关所有 C++ 转义序列含义的更多信息,请参阅此页面

要回答您的具体问题:

  1. \表示转义序列,由其他选项处理,未转义"表示字符串文字的结尾。通用的“任何字符”匹配不匹配这些字符中的任何一个,因此它们可以被表达式的其他部分匹配。
  2. 上面回答:\\[0-7]{1,3}表示 a\后跟一到三个八进制数字。
  3. 上面回答:\\[Xx][0-9a-fA-F]+表示a\后跟Xx后跟一个或多个十六进制数字
  4. UCN是通用字符名称的缩写。它表示一个 Unicode 字符,但没有说明它的编码。

推荐阅读