首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么JFlex拒绝.+?(?=->)

为什么JFlex拒绝.+?(?=->)
EN

Stack Overflow用户
提问于 2020-02-14 20:04:44
回答 1查看 66关注 0票数 0

我正在尝试设计简单的语言想法插件。我想匹配下面的示例代码作为3个令牌作为文本在->之前,在->:之间,在:之后

例如:First part -> Second Part: Third part

首先,当我在https://regex101.com/r/TDBWg0/1上尝试使用正则表达式.+?(?=->)时,它是有效的。但是根据JFlex,.+?(?=->)有一个语法错误:

代码语言:javascript
复制
Error in file "Simple.flex" (line 41):  
Syntax error.
FIRST_PART=.+(?=(->))  
              ^
EN

回答 1

Stack Overflow用户

发布于 2020-02-15 20:52:01

像JFlex这样的词法分析器生成器通常具有与大多数其他正则表达式实现不同的语法和特性集,所以像regex101这样的帮助器对它们并不总是那么有用。相反,您应该查看the JFlex manual以了解JFlex支持哪些语法。

这里有两件值得注意的事情:

对于非贪婪的量词

  • < /regex >没有语法需要用引号或进行转义

所以.+/"->"将是一个有效的正则表达式,但是当有多个->时,它将匹配到最后一个->,而不是第一个。假设您试图使+不贪婪,以便它只与第一个匹配,所以这并不好。

由于JFlex中没有非贪婪修饰符,因此我们需要一种不同的方法。如果我们再次查看可用的正则表达式特性,我们将看到有一个运算符~,它的工作方式如下:

~a (最多)

匹配所有内容,直到(包括) a匹配的文本的第一个匹配项。表达式~a等同于!([^]* a [^]*) a。传统的C风格注释是由"/*" ~"*/"匹配的。

因此,您需要的正则表达式是simpy ~"->"

另一种方法适用于几乎所有的正则表达式实现,那就是编写一个正则表达式,该正则表达式明确地匹配所有不是->的内容,即任何非-字符或不跟>-。所以这就是:

代码语言:javascript
复制
([^-]|-[^\>])+
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60226013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档