【问题标题】:How to escape a regex when used in a lex input file?在 lex 输入文件中使用时如何转义正则表达式?
【发布时间】:2016-12-05 19:34:30
【问题描述】:

我想从这个answer to this question使用这个正则表达式 (["'])(?:(?=(\?))\2.)*?\1

但是当我在 lex 输入文件中使用它时,如下所示:

DOUBLEQUOTE_CONTENTS (["'])(?:(?=(\?))\2.)*?\1

%%

{DOUBLEQUOTE_CONTENTS} { printf("这里"); }

我从 lex 收到大量“无法识别的字符”错误。第一眼就噎住了?性格等等。如果我逃避?字符,正则表达式不再匹配。

如何在 lex 输入文件中使用上述正则表达式?

【问题讨论】:

  • @WiktorStribiżew 可能是这样,但我相信这个问题是偶然的。
  • 我想你只需要展开模式:"[^"\\]*(\\.[^"\\]*)*"|'[^'\\]*(\\.[^'\\]*)*'

标签: regex lex


【解决方案1】:

(F)lex 没有实现前瞻((?=...) 和朋友),也没有实现非贪婪重复(*?)。而且它没有捕获,所以非捕获括号 ((?:...)) 是多余的。最后,它没有实现反向引用 (\2)。

简而言之,您只能使用真正正则的正则表达式。请参阅flex manual 了解允许的内容。

这是一个不依赖于前瞻或反向引用的简单模式:

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

【讨论】:

  • 您提供的模式由于交替而效率低下。我建议使用我上面评论中的正则表达式。
  • @wiktor:在 flex 中,交替是免费的,因为 flex 创建了一个 DFA。请参阅此答案,其中包括基准:stackoverflow.com/a/26922380/1566221
猜你喜欢
  • 2016-10-12
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 2010-09-08
相关资源
最近更新 更多