如何使用匹配规则进行解析,只要结果不是某个特定的字符串[pest.rs]



我遇到了一个问题,当试图定义一个"标识"使用pest.rs语法,其中标识符作为不在保留关键字集合中的字符串。

我想使用一个任意匹配规则(假设它是ASCII_ALPHA_LOWER+),所以可以有任何非零数量的小写字母一个接一个,但我希望规则只匹配,如果结果是而不是等于一个特定的字符串(例如,"abc")。

在regex中,这可以通过与锚字符^(?!abc$)[a-z]+结合使用负向前看来实现,因为锚在匹配abc时立即停止负向前看,这意味着像abcd这样的字符串将是匹配的。

但是,pest没有这些锚字符,最好的方法是:

identifier { 
!("abc") ~ ASCII_ALPHA_LOWER+ 
}

但是因为没有锚字符,任何以abc开头的字符串都将被匹配,而不管它的其余字符,这不是最优的,因为我只希望规则在完全匹配保留关键字之一时失败。

有谁知道我怎么能实现相同的功能与pest的语法正则表达式?

使用可选的修饰符:

ident = { "abc"? ~ ASCII_ALPHA_LOWER+}

这要求如果标识符以关键字开头,那么它后面必须有一些东西。

最新更新