我正在尝试设计简单的语言想法插件。我想匹配下面的示例代码作为3个令牌作为文本在->之前,在->和:之间,在:之后
例如:First part -> Second Part: Third part
首先,当我在https://regex101.com/r/TDBWg0/1上尝试使用正则表达式.+?(?=->)时,它是有效的。但是根据JFlex,.+?(?=->)有一个语法错误:
Error in file "Simple.flex" (line 41):
Syntax error.
FIRST_PART=.+(?=(->))
^发布于 2020-02-15 20:52:01
像JFlex这样的词法分析器生成器通常具有与大多数其他正则表达式实现不同的语法和特性集,所以像regex101这样的帮助器对它们并不总是那么有用。相反,您应该查看the JFlex manual以了解JFlex支持哪些语法。
这里有两件值得注意的事情:
对于非贪婪的量词
/regex >没有语法需要用引号或进行转义所以.+/"->"将是一个有效的正则表达式,但是当有多个->时,它将匹配到最后一个->,而不是第一个。假设您试图使+不贪婪,以便它只与第一个匹配,所以这并不好。
由于JFlex中没有非贪婪修饰符,因此我们需要一种不同的方法。如果我们再次查看可用的正则表达式特性,我们将看到有一个运算符~,它的工作方式如下:
~a(最多)
匹配所有内容,直到(包括) a匹配的文本的第一个匹配项。表达式~a等同于!([^]* a [^]*) a。传统的C风格注释是由"/*" ~"*/"匹配的。
因此,您需要的正则表达式是simpy ~"->"。
另一种方法适用于几乎所有的正则表达式实现,那就是编写一个正则表达式,该正则表达式明确地匹配所有不是->的内容,即任何非-字符或不跟>的-。所以这就是:
([^-]|-[^\>])+https://stackoverflow.com/questions/60226013
复制相似问题