我正在尝试设计简单的语言创意插件。 我想将以下示例代码作为 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=.+(?=(->))
^
像JFlex这样的词法生成器通常具有与大多数其他正则表达式实现不同的语法和功能集,因此像regex101这样的帮助程序对它们并不总是那么有用。相反,您应该查看 JFlex 手册,了解 JFlex 支持哪种语法。
这里有两点需要注意:
- 前瞻的语法
/regex
不是(?=regex)
- 非贪婪量词没有语法
- <和>需要引用或转义和>
所以.+/"->"
将是一个有效的正则表达式,但是当有多个->
时,它将匹配到最后一个->
,而不是第一个。大概你试图让+
不贪婪,这样它只会与第一个匹配,所以这不好。
由于 JFlex 中没有非贪婪修饰符,我们需要一种不同的方法。如果我们再次查看可用的正则表达式功能,我们将看到有一个运算符~
,其工作原理如下:
~a
(最多(匹配所有内容,直到(包括(与
a
匹配的文本的第一次出现。表达式~a
等效于!([^]* a [^]*) a
。传统的 C 样式注释与"/*" ~"*/"
匹配。
所以你想要的正则表达式很简单~"->"
.
另一种适用于几乎所有正则表达式实现的方法,是编写一个正则表达式,专门匹配所有不是->
的内容,即任何非-
字符或-
后不跟>
。所以那就是:
([^-]|-[^>])+