【问题标题】:flex regex use {-} with trailing contextflex 正则表达式使用带有尾随上下文的 {-}
【发布时间】:2016-01-15 10:41:54
【问题描述】:

我正在处理嵌套的 cmets。我想一次跳过尽可能多的不相关字符。但是模式<COMMENT>[^\n]{-}\//\*{-}\*/\/ 是非法的。有什么建议吗?

更新
鉴于以下情况:

/**comment* text/**comment text**/comment*/

捕获第一个/*后,进入COMMENT条件。现在我想在一场比赛中吃掉尽可能多的字符(不是/**/)。由于 flex 选择最长的匹配,我不知道如何匹配隔离的*s(不是*,后跟/)和隔离的/s。而且\//\*不是一个字符类,所以我们无法计算它和另一个类的区别。

【问题讨论】:

  • 您能否提供您想用自然语言编写的正则表达式的描述?例如,这种组合\*{-}\* 是无效的,但即使你将它修改为有效的[\*]{-}[\*],它也没有任何意义,因为它是一个空集......另外请注意,你不能只匹配嵌套的 cmets 与 single正则表达式——它们需要上下文无关的语法匹配器。
  • @gudok 谢谢你的帮助,我已经更新了问题。很抱歉没有澄清它。
  • 这个答案可能很有用:stackoverflow.com/a/34515078/1566221

标签: flex-lexer


【解决方案1】:
%%
"/\*"              { 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); }
%%

这里最长匹配规则帮助我们。想法是分别匹配独立的单个 */ 符号,而所有其他文本都被批量使用(因此不会降低性能)。

上面例子的结果:

OPEN_COMMENT [/*]
TEXT [*]
TEXT [comment]
TEXT [*]
TEXT [ text]
OPEN_COMMENT [/*]
TEXT [*]
TEXT [comment text]
TEXT [*]
CLOSE_COMMENT [*/]
TEXT [comment]
CLOSE_COMMENT [*/]
TEXT [
]

【讨论】:

  • 知道了!非常感谢:)
猜你喜欢
  • 1970-01-01
  • 2020-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多