c++ - 如何理解 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 }
%%
我不知道正则表达式中的这些部分:
- 是否
[^\"\\]
意味着不匹配\"
或\\
?如果是这样,为什么需要指定这个不匹配?因为\"
并且\\
似乎没有出现在另一组中。 - 是什么
\\[0-7]{1,3}
意思? - 是什么
\\[Xx][0-9a-fA-F]
意思? UCN
是 utf-8 的意思吗?
解决方案
该正则表达式匹配以下内容:
- 一个
"
性格, - 后跟以下一项或多项的任意组合:
[^\"\\]
"
- 除或以外的任何字符\
\\['"?\\abfnrtv]
- A\
后跟'
,"
,?
,\
,a
,b
,f
,n
,r
,t
, 或v
.\\[0-7]{1,3}
- A\
后跟一到三个八进制数字。\\[Xx][0-9a-fA-F]+
- A\
后跟X
或x
后跟一个或多个十六进制数字。{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++ 转义序列含义的更多信息,请参阅此页面。
要回答您的具体问题:
\
表示转义序列,由其他选项处理,未转义"
表示字符串文字的结尾。通用的“任何字符”匹配不匹配这些字符中的任何一个,因此它们可以被表达式的其他部分匹配。- 上面回答:
\\[0-7]{1,3}
表示 a\
后跟一到三个八进制数字。 - 上面回答:
\\[Xx][0-9a-fA-F]+
表示a\
后跟X
或x
后跟一个或多个十六进制数字 UCN
是通用字符名称的缩写。它表示一个 Unicode 字符,但没有说明它的编码。
推荐阅读
- openshift - 如何知道 OpenShift 中的 Pod 重启/崩溃的原因?
- android - 滚动行为与子 RecyclerView 和父 Viewpager2 冲突
- google-sheets-api - google-api-python-client 创建服务对象的最佳实践
- rdf - Removing triples from imported rdf files in a GraphDB repository
- javascript - 如何在 WebAssembly 中使用一系列 Promise 处理 ChirpSDK 事件
- javascript - Regex for even index replacement with asterisk in email
- node.js - Node.js plesk - 使用 nodemailer 发送电子邮件不起作用
- pipeline - 是否可以在多阶段构建期间将工件存储到 Circle CI 中?
- php - 在 Google App Engine 中连接到 Google Cloud SQL
- java - How can I find the first commit of a branch with JGit?