解析器表达式语法 - 如何匹配不包括单个字符的任何字符串?
Parser expression grammar - how to match any string excluding a single character?
我想编写一个匹配文件系统路径的 PEG。路径元素是 posix linux.
中除 /
之外的任何字符
PEG 中有一个表达式可以匹配 any
个字符,但我不知道如何匹配除一个字符以外的任何字符。
我使用的 peg 解析器是 PEST for rust。
您可以在 https://docs.rs/pest/0.4.1/pest/macro.grammar.html#syntax 中找到 PEST 语法,特别是 "negative lookahead"
!a
— matches if a
doesn't match without making progress
所以你可以这样写
!["/"] ~ 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());
}
我想编写一个匹配文件系统路径的 PEG。路径元素是 posix linux.
中除/
之外的任何字符
PEG 中有一个表达式可以匹配 any
个字符,但我不知道如何匹配除一个字符以外的任何字符。
我使用的 peg 解析器是 PEST for rust。
您可以在 https://docs.rs/pest/0.4.1/pest/macro.grammar.html#syntax 中找到 PEST 语法,特别是 "negative lookahead"
!a
— matches ifa
doesn't match without making progress
所以你可以这样写
!["/"] ~ 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());
}