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
35KB
736 行
vec-reg
向量通用的正则表达式模式匹配
安装
# 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 |
R 或 S (优先 R ) |
R? |
零个或一个 R ,优先一个 |
R?? |
零个或一个 R ,优先零个 |
R* |
零个或多个 R ,优先多个 |
R*? |
零个或多个 R ,优先较少 |
R+ |
一个或多个 R ,优先多个 |
R+? |
一个或多个 R ,优先较少 |
R{n,m} |
n 或 n + 1 或 ... 或 m ,优先多个 |
R{n,m}? |
n 或 n + 1 或 ... 或 m ,优先较少 |
R{n,} |
n 或更多 R ,优先多个 |
R{n,}? |
n 或更多 R ,优先较少 |
R{n} |
正好 n R |
R{n}? |
正好 n R |
依赖
~0–310KB