8 个版本 (破坏性更新)

0.7.1 2022年9月5日
0.7.0 2022年8月31日
0.6.0 2022年8月30日
0.5.1 2022年8月29日
0.1.0 2022年8月27日

#9 in #generalized

每月26次下载
用于 2 crates

Apache-2.0

35KB
736

vec-reg

向量通用的正则表达式模式匹配

Build status Crates.io Documentation

安装

# Cargo.toml
[dependencies]
vec-reg = "0.7.1"

用法

use vec_reg::{Regex, CompiledRegex, vec_reg};

let is_fizz = |x: &i32| x % 3 == 0;
let is_buzz = |x: &i32| x % 5 == 0;
let reg = vec_reg!(([is_fizz])((?:[is_buzz])(?P<"FizzBuzz">[|x| x % 15 == 0]))+).compile();    
assert!(reg.is_match(&[1, 2, 3, 5, 15, 20]));
assert!(reg.is_full_match(&[3, 5, 15, 10, 30]));

let find_result = reg.find(&[1,3,5,15]);
assert!(find_result.is_some());
assert_eq!(find_result.as_ref().unwrap().range(), 1..4);

let captures = reg.captures(&[1, 3, 5, 15, 10, 30, 2]);
assert!(captures.is_some());
// 0th capture always correspond to the entire match.
assert_eq!(captures.as_ref().unwrap().get(0).unwrap().range(), 1..6);

assert_eq!(captures.as_ref().unwrap().get(1).unwrap().range(), 1..2);
assert_eq!(captures.as_ref().unwrap().get(1).unwrap().values(), &[3]);

// Named capture can be accessed both index and name.
assert_eq!(captures.as_ref().unwrap().get(3).unwrap().values(), &[30]);
assert_eq!(captures.as_ref().unwrap().get(3).unwrap().range(), 5..6);

assert_eq!(captures.as_ref().unwrap().name("FizzBuzz").unwrap().values(), &[30]);
assert_eq!(captures.as_ref().unwrap().name("FizzBuzz").unwrap().range(), 5..6);

支持的语法

语法 描述
[function_name] 匹配满足给定函数的任何值。
[|x| *x== 1] 匹配满足给定闭包的任何值。
[^function_name] 匹配不满足给定函数的任何值。
[^|x| *x== 1] 匹配不满足给定闭包的任何值。
. 匹配任何值。
^ 输入的开始
$ 输入的结束
(R) 编号捕获组(子匹配)
(?:R) 非捕获组
(?P<"名称">R) 命名 & 编号捕获组(子匹配)
RS R 后跟 S
R|S RS(优先 R
R? 零个或一个 R,优先一个
R?? 零个或一个 R,优先零个
R* 零个或多个 R,优先多个
R*? 零个或多个 R,优先较少
R+ 一个或多个 R,优先多个
R+? 一个或多个 R,优先较少
R{n,m} nn + 1 或 ... 或 m,优先多个
R{n,m}? nn + 1 或 ... 或 m,优先较少
R{n,} n 或更多 R,优先多个
R{n,}? n 或更多 R,优先较少
R{n} 正好 n R
R{n}? 正好 n R

依赖

~0–310KB