解析器表达式语法 - 如何匹配排除单个字符的任何字符串?

时间:2017-04-07 04:31:42

标签: parsing rust grammar peg

我想写一个与文件系统路径匹配的PEG。路径元素是posix linux中除/之外的任何字符。

PEG中有一个匹配any字符的表达式,但我无法弄清楚如何匹配除一个字符之外的任何字符。

我正在使用的peg解析器是PEST for rust。

1 个答案:

答案 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());
}