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

mar*_*hon 2 grammar parsing peg rust

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

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

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

ken*_*ytm 5

你可以在https://docs.rs/pest/0.4.1/pest/macro.grammar.html#syntax中找到PEST语法,特别是有一个"负向前瞻"

!a- 匹配如果a不匹配而没有取得进展

所以你可以写

!["/"] ~ any
Run Code Online (Sandbox Code Playgroud)

例:

// 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());
}
Run Code Online (Sandbox Code Playgroud)