我遇到了一个问题,当试图定义一个"标识"使用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+}
这要求如果标识符以关键字开头,那么它后面必须有一些东西。