flex 正则表达式使用带有尾随上下文的 {-}
flex regex use {-} with trailing context
我正在处理嵌套评论。我想一次跳过尽可能多的不相关字符。但是模式 <COMMENT>[^\n]{-}\//\*{-}\*/\/
是非法的。有什么建议吗?
更新:
给定以下情况:
/**comment* text/**comment text**/comment*/
捕获第一个/*
后,进入COMMENT
状态。现在我想用一场比赛吃掉尽可能多的字符(不是 /*
或 */
)。由于 flex 选择最长的匹配,我不知道如何匹配孤立的 *
s(不是 *
后跟 /
)和孤立的 /
s。而 \//\*
不是一个字符 class,所以我们无法计算它与另一个 class.
之间的差异
%%
"/\*" { printf("OPEN_COMMENT [%s]\n", yytext); }
"\*/" { printf("CLOSE_COMMENT [%s]\n", yytext); }
[^*/]+ { printf("TEXT [%s]\n", yytext); }
"\*" { printf("TEXT [%s]\n", yytext); }
"/" { printf("TEXT [%s]\n", yytext); }
%%
这里 longest-match 规则 帮助 我们。想法是分别匹配 free-standing 单个 *
和 /
符号,同时批量消耗所有其他文本(因此不会降低性能)。
以上示例的结果:
OPEN_COMMENT [/*]
TEXT [*]
TEXT [comment]
TEXT [*]
TEXT [ text]
OPEN_COMMENT [/*]
TEXT [*]
TEXT [comment text]
TEXT [*]
CLOSE_COMMENT [*/]
TEXT [comment]
CLOSE_COMMENT [*/]
TEXT [
]
我正在处理嵌套评论。我想一次跳过尽可能多的不相关字符。但是模式 <COMMENT>[^\n]{-}\//\*{-}\*/\/
是非法的。有什么建议吗?
更新:
给定以下情况:
/**comment* text/**comment text**/comment*/
捕获第一个/*
后,进入COMMENT
状态。现在我想用一场比赛吃掉尽可能多的字符(不是 /*
或 */
)。由于 flex 选择最长的匹配,我不知道如何匹配孤立的 *
s(不是 *
后跟 /
)和孤立的 /
s。而 \//\*
不是一个字符 class,所以我们无法计算它与另一个 class.
%%
"/\*" { printf("OPEN_COMMENT [%s]\n", yytext); }
"\*/" { printf("CLOSE_COMMENT [%s]\n", yytext); }
[^*/]+ { printf("TEXT [%s]\n", yytext); }
"\*" { printf("TEXT [%s]\n", yytext); }
"/" { printf("TEXT [%s]\n", yytext); }
%%
这里 longest-match 规则 帮助 我们。想法是分别匹配 free-standing 单个 *
和 /
符号,同时批量消耗所有其他文本(因此不会降低性能)。
以上示例的结果:
OPEN_COMMENT [/*]
TEXT [*]
TEXT [comment]
TEXT [*]
TEXT [ text]
OPEN_COMMENT [/*]
TEXT [*]
TEXT [comment text]
TEXT [*]
CLOSE_COMMENT [*/]
TEXT [comment]
CLOSE_COMMENT [*/]
TEXT [
]