#regex #string #match #nfa #utf-8 #dfa #infinite

regex-utils

正则表达式工具,例如枚举匹配正则表达式的所有字符串

1 个不稳定版本

0.1.0 2023年7月16日

#15#infinite

MIT 协议

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