1 个不稳定版本
0.1.0 | 2023年7月16日 |
---|
#15 在 #infinite
33KB
624 行
regex-utils
Rust 用于处理正则表达式的实用工具
正则表达式迭代
给定一个正则表达式,生成所有(可能无限)匹配该模式的可能输入。
use regex_utils::{DenseDfaIter, NfaIter, Utf8Iter};
// parse a regex as an NFA
let iter = NfaIter::new(r"a+(0|1)").unwrap();
// and expect it to be utf8
let iter = Utf8Iter::try_from(iter).unwrap();
// Because the regex has an infinite pattern (`+`)
// the iterator will be infinite. Let's take a subset
let x: Vec<String> = iter.take(10).collect();
assert_eq!(x, [
"a0".to_owned(),
"a1".to_owned(),
"aa0".to_owned(),
"aa1".to_owned(),
"aaa0".to_owned(),
"aaa1".to_owned(),
"aaaa0".to_owned(),
"aaaa1".to_owned(),
"aaaaa0".to_owned(),
"aaaaa1".to_owned(),
]);
// parse a regex as a dense DFA
let iter = DenseDfaIter::new(r"foo|(bar){1,2}|quux").unwrap();
// The regex has a finite number of states, so we can collect all of them
let x: Vec<Vec<u8>> = iter.collect();
assert_eq!(x, [
b"bar".to_vec(),
b"foo".to_vec(),
b"quux".to_vec(),
b"barbar".to_vec(),
]);
NFA(非确定有限自动机)
使用 NfaIter
,你可以通过一个 NFA
遍历正则表达式。NFAs 是正则表达式的低内存表示,但速度较慢。
这些不能保证输出字符串是唯一的(因为图是非确定的),但搜索空间内存将会小得多。
DFA(确定有限自动机)
使用 DfaIter
,你可以通过一个 DFA
遍历正则表达式。DFAs 是正则表达式的高内存表示,但需要使用更多的内存。
这些保证输出字符串是唯一的,但搜索空间可能会使用更多的内存。
Utf8
使用 Utf8Iter
,你可以将 NFA 或 DFA 迭代器的输出作为正则表达式的 String
表示形式获取,但代价是使用更多的内存。
这些保证输出字符串是唯一的,但搜索空间可能会使用更多的内存。
依赖项
~3MB
~37K SLoC