如何理解 flex C/C++ 字符串文字正则表达式?
How to understand the flex C/C++ string literal regex?
我正在学习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 吗?
[^...]
表示匹配任何单个元素 not ...
\[0-7]{1,3}
表示匹配 \ 后跟 0-7 集合中的一到三个字符(匹配不必是相同的字符,例如匹配“\123” )
\[Xx][0-9a-fA-F]
表示匹配 \ 后跟 x 或 X 后跟集合 0-9a-fA-F
[=31= 中的字符]
UCN 是 lex 自定义定义的示例,此类定义允许以后重复使用正则表达式模式,而无需复制整个模式;相反,它可以只包含在大括号 {UCN}
中
我建议你找到 material 关于正则表达式,如果前三个真的很混乱,flex 手册可以告诉你定义:https://www.cs.virginia.edu/~cr4bd/flex-manual/Definitions-Section.html#Definitions-Section
该正则表达式匹配以下内容:
- 一个
"
个字符,
- 后跟以下一项或多项的任意组合:
[^\"\]
- "
或 \
以外的任何字符
\['"?\abfnrtv]
- \
后跟 '
、"
、?
、\
、a
中的任何一个, b
, f
, n
, r
, t
, 或 v
.
\[0-7]{1,3}
- \
后跟一到三个八进制数字。
\[Xx][0-9a-fA-F]+
- \
后跟 X
或 x
后跟一个或多个十六进制数字。
{UCN}
,扩展为 (\u[0-9a-fA-F]{4}|\U[0-9a-fA-F]{8})
- 以下任意一项:
\u[0-9a-fA-F]{4}
- \
后跟 u
后跟四个十六进制数字
\U[0-9a-fA-F]{8}
- \
后跟 U
后跟八个十六进制数字
- 后跟结束
"
个字符
请注意,这实际上不是匹配所有 C++ 字符串文字的正确模式,因为
- 不匹配空字符串(
""
)
- 十六进制转义码必须以小写
x
开头。匹配这些的更好模式是 \x[0-9a-fA-F]+
有关所有 C++ 转义序列含义的详细信息,请参阅 this page。
回答您的具体问题:
\
表示转义序列,由其他选项处理,未转义的 "
表示字符串文字的结尾。通用 "any character" 匹配不匹配这些字符中的任何一个,因此它们可以与表达式的其他部分匹配。
- 上面回答:
\[0-7]{1,3}
表示一个\
后跟一到三个八进制数。
- 上面回答:
\[Xx][0-9a-fA-F]+
表示\
后跟[=31=]或x
后跟一个或多个十六进制数字
UCN
是通用字符名称的缩写。它表示一个 Unicode 字符,但没有说明其编码。
我正在学习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 吗?
[^...]
表示匹配任何单个元素 not ...\[0-7]{1,3}
表示匹配 \ 后跟 0-7 集合中的一到三个字符(匹配不必是相同的字符,例如匹配“\123” )
[=31= 中的字符]\[Xx][0-9a-fA-F]
表示匹配 \ 后跟 x 或 X 后跟集合 0-9a-fA-FUCN 是 lex 自定义定义的示例,此类定义允许以后重复使用正则表达式模式,而无需复制整个模式;相反,它可以只包含在大括号 {UCN}
中
我建议你找到 material 关于正则表达式,如果前三个真的很混乱,flex 手册可以告诉你定义:https://www.cs.virginia.edu/~cr4bd/flex-manual/Definitions-Section.html#Definitions-Section
该正则表达式匹配以下内容:
- 一个
"
个字符, - 后跟以下一项或多项的任意组合:
[^\"\]
-"
或\
以外的任何字符
\['"?\abfnrtv]
-\
后跟'
、"
、?
、\
、a
中的任何一个,b
,f
,n
,r
,t
, 或v
.\[0-7]{1,3}
-\
后跟一到三个八进制数字。\[Xx][0-9a-fA-F]+
-\
后跟X
或x
后跟一个或多个十六进制数字。{UCN}
,扩展为(\u[0-9a-fA-F]{4}|\U[0-9a-fA-F]{8})
- 以下任意一项:\u[0-9a-fA-F]{4}
-\
后跟u
后跟四个十六进制数字\U[0-9a-fA-F]{8}
-\
后跟U
后跟八个十六进制数字
- 后跟结束
"
个字符
请注意,这实际上不是匹配所有 C++ 字符串文字的正确模式,因为
- 不匹配空字符串(
""
) - 十六进制转义码必须以小写
x
开头。匹配这些的更好模式是\x[0-9a-fA-F]+
有关所有 C++ 转义序列含义的详细信息,请参阅 this page。
回答您的具体问题:
\
表示转义序列,由其他选项处理,未转义的"
表示字符串文字的结尾。通用 "any character" 匹配不匹配这些字符中的任何一个,因此它们可以与表达式的其他部分匹配。- 上面回答:
\[0-7]{1,3}
表示一个\
后跟一到三个八进制数。 - 上面回答:
\[Xx][0-9a-fA-F]+
表示\
后跟[=31=]或x
后跟一个或多个十六进制数字 UCN
是通用字符名称的缩写。它表示一个 Unicode 字符,但没有说明其编码。