我想写一个与文件系统路径匹配的PEG。路径元素是posix linux中除/
之外的任何字符。
PEG中有一个匹配any
字符的表达式,但我无法弄清楚如何匹配除一个字符之外的任何字符。
我正在使用的peg解析器是PEST for rust。
答案 0 :(得分:5)
您可以在https://docs.rs/pest/0.4.1/pest/macro.grammar.html#syntax中找到PEST语法,特别是“负向前瞻”
!a
- 如果a
不匹配而没有取得进展,则匹配
所以你可以写
!["/"] ~ any
示例:
// cargo-deps: pest
#[macro_use] extern crate pest;
use pest::*;
fn main() {
impl_rdp! {
grammar! {
path = @{ soi ~ (["/"] ~ component)+ ~ eoi }
component = @{ (!["/"] ~ any)+ }
}
}
println!("should be true: {}", Rdp::new(StringInput::new("/bcc/cc/v")).path());
println!("should be false: {}", Rdp::new(StringInput::new("/bcc/cc//v")).path());
}