flex / lex中字符串文字的正则表达式

问题描述 投票:50回答:6

我正在尝试学习flex,并希望匹配字符串文字。我的代码当前看起来像:

"\""([^\n\"\\]*(\\[.\n])*)*"\""        {/*matches string-literal*/;}

我一直在努力进行一个小时左右的变更,无法使其按预期的方式工作。我本质上希望匹配的字符串文字不能包含换行符(除非已转义)并且支持转义字符。

我可能只是写了一个不好的正则表达式或一个与flex不兼容的表达式。请指教!

c regex lex string-literals flex-lexer
6个回答
112
投票

字符串由引号组成

"

后跟零个或多个逃脱的东西

\\.

或非引号字符,非反斜杠字符

[^"\\]

最后是引号

"

将它们放在一起,就可以了

\"(\\.|[^"\\])*\"

因为引号是Flex元字符,所以将引号引起了转义。


23
投票

对于单行...,您可以使用此:

\"([^\\\"]|\\.)*\"  {/*matches string-literal on a single line*/;}

8
投票

如何使用开始状态...

int enter_dblquotes = 0;%x个DBLQUOTES%%\“ {BEGIN(DBLQUOTES); enter_dblquotes ++;} * \“{如果(enter_dblquotes){handle_this_dblquotes(yytext);BEGIN(INITIAL); / *恢复正常* /enter_dblquotes--;}}...遵循更多规则...

类似于该效果(flex使用%s%x指示期望的状态。当flex输入检测到引号时,它将切换到另一种状态,然后继续词法化直到到达另一个引号,在它恢复到正常状态。


0
投票

到来较晚,但对下一个需要它的人很有用:

\"(([^\"]|\\\")*[^\\])?\"

0
投票

这是我们在Zolang中用于带有嵌入式模板${...}的单行字符串文字的含义>>

\"(\$\{.*\}|\\.|[^\"\\])*\"


0
投票

粘贴有关在flex中处理字符串的代码段,希望激发您的思考。

© www.soinside.com 2019 - 2024. All rights reserved.