Lex/Flex:C/C++ 中字符串文字的正则表达式?
Lex/Flex :Regular expression for string literals in C/C++?
我看这里ANSI C grammar .
此页面包含大量 Lex/Flex ANSI C 正则表达式。
在理解字符串文字的正则表达式时遇到问题。
他们提到正则表达式为 \"(\.|[^\"])*\"
据我了解\"
这是用于双引号,\
用于转义字符,.
用于除escape character
和[=17之外的任何字符=] 表示零次或多次。
[^\"]
表示除 \
、 "
.
之外的字符
所以,在我看来,正则表达式应该是\"(\.)*\"
。
你能给出一些上面的正则表达式会失败的字符串吗?
或
为什么他们用了[^\"]
?
您建议的正则表达式 \"(\.)*\"
匹配由 \
符号与任何字符交替组成的字符串,例如:
"\z\x\p\r"
因此,此正则表达式无法匹配如下字符串:
"hello"
字符串 "hello"
将与正则表达式 \".*\"
匹配,但它也将匹配字符串 """"
或 "\"
,两者均无效。
为了摆脱这些无效的匹配,我们可以使用 \"[^\"]*\"
,但是现在这将无法匹配像 "\a\a\a"
这样的字符串,这是一个有效的字符串。
我们看到 \"(\.)*\"
确实匹配这个字符串,所以我们需要做的就是将这两个组合起来得到 \"(\.|[^\"])*\"
.
我看这里ANSI C grammar .
此页面包含大量 Lex/Flex ANSI C 正则表达式。
在理解字符串文字的正则表达式时遇到问题。
他们提到正则表达式为 \"(\.|[^\"])*\"
据我了解\"
这是用于双引号,\
用于转义字符,.
用于除escape character
和[=17之外的任何字符=] 表示零次或多次。
[^\"]
表示除 \
、 "
.
所以,在我看来,正则表达式应该是\"(\.)*\"
。
你能给出一些上面的正则表达式会失败的字符串吗?
或
为什么他们用了[^\"]
?
您建议的正则表达式 \"(\.)*\"
匹配由 \
符号与任何字符交替组成的字符串,例如:
"\z\x\p\r"
因此,此正则表达式无法匹配如下字符串:
"hello"
字符串 "hello"
将与正则表达式 \".*\"
匹配,但它也将匹配字符串 """"
或 "\"
,两者均无效。
为了摆脱这些无效的匹配,我们可以使用 \"[^\"]*\"
,但是现在这将无法匹配像 "\a\a\a"
这样的字符串,这是一个有效的字符串。
我们看到 \"(\.)*\"
确实匹配这个字符串,所以我们需要做的就是将这两个组合起来得到 \"(\.|[^\"])*\"
.