aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonas Maier <jonas@x77.dev>2026-06-03 20:16:00 +0200
committerJonas Maier <jonas@x77.dev>2026-06-03 20:19:16 +0200
commit38e8e7bf000aaa1f7f6be15d72be35d6dc585271 (patch)
tree09b08f221e6bb2a64767a4e1e77c63f246cd0a43
parent5ce263b586c5047d16ee93cc53bc3bce6f7ff12c (diff)
downloadpish-38e8e7bf000aaa1f7f6be15d72be35d6dc585271.tar.gz
shitton of test cases that codex generated
-rw-r--r--.gitignore1
-rw-r--r--src/parse/regex/mod.rs4
-rw-r--r--tests/common.rs15
-rw-r--r--tests/regex-data.json551
-rwxr-xr-xtests/regex-gen.sh41
5 files changed, 609 insertions, 3 deletions
diff --git a/.gitignore b/.gitignore
index ea8c4bf..aebf3ad 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
+/tests/regex.rs
/target
diff --git a/src/parse/regex/mod.rs b/src/parse/regex/mod.rs
index b8dd8ba..f35d3f2 100644
--- a/src/parse/regex/mod.rs
+++ b/src/parse/regex/mod.rs
@@ -271,8 +271,8 @@ impl Pattern {
}
impl CompiledPattern {
- pub fn matches(&self, bytes: &[u8]) -> bool {
- self.dfa.matches(bytes)
+ pub fn matches(&self, bytes: impl AsRef<[u8]>) -> bool {
+ self.dfa.matches(bytes.as_ref())
}
}
diff --git a/tests/common.rs b/tests/common.rs
index 8541368..acf562e 100644
--- a/tests/common.rs
+++ b/tests/common.rs
@@ -1,4 +1,10 @@
-#[cfg(test)]
+#![allow(unused)]
+
+use pish::parse::{
+ Parse,
+ regex::{CompiledPattern, Pattern},
+};
+
pub fn test_case(_name: &str, script: &[u8], expected_output: &[u8]) {
use pish::parse::Parse;
use pish::rw::*;
@@ -23,3 +29,10 @@ pub fn test_case(_name: &str, script: &[u8], expected_output: &[u8]) {
actual_output.escape_ascii()
);
}
+
+pub fn regex(pat: &str) -> CompiledPattern {
+ Pattern::parse_from_bytes(pat.as_bytes())
+ .expect(&format!("pattern {pat} does not parse"))
+ .try_compile()
+ .expect(&format!("pattern {pat} does not compile"))
+}
diff --git a/tests/regex-data.json b/tests/regex-data.json
new file mode 100644
index 0000000..18a15e9
--- /dev/null
+++ b/tests/regex-data.json
@@ -0,0 +1,551 @@
+{"regex":"([0-3]|[a-c])+d","accepts":["0d","ad","23bd","c0a1d"],"rejects":["d","4d","ad0","a4d"]}
+{"regex":"[0-9][0-9]*[a-z]","accepts":["0a","12b","999z"],"rejects":["a","1","1A","01ab"]}
+{"regex":"[0-9-a]","accepts":["-","0","1","4"],"rejects":["","X","Y","Z"]}
+{"regex":"[0-9]+","accepts":["0","7","12345"],"rejects":["","a","12a","-1"]}
+{"regex":"(?=[0-9]+[a-z])[0-9]+[a-z]","accepts":["1a","123z","09b"],"rejects":["","123","a1","12az"]}
+{"regex":"(?![0-9]+)[a-z]+","accepts":["abc","x","zero"],"rejects":["","123","1abc","abc1"]}
+{"regex":"([0a-z][a-z0-9]*,)+","accepts":["0,","a5,","a5,b7,c9,"],"rejects":["",",","A5,","a5,b7,c9"]}
+{"regex":"([0a-z][a-z0-9]*,)+","accepts":["a5,","0,","a5,b7,c9,"],"rejects":["","A5,","a5,b7"]}
+{"regex":"[0-z]","accepts":["0","U","z","1"],"rejects":["","00","01","10"]}
+{"regex":"1|2|3|4|5|6|7|8|9|10|int","accepts":["1","10","int"],"rejects":["0","11","integer"]}
+{"regex":"1234","accepts":["1234"],"rejects":["","123","01234","12345"]}
+{"regex":"12(?!)|3","accepts":["3"],"rejects":["","12","123","13"]}
+{"regex":"a(?![0-9])[a-z]","accepts":["aa","az","ab"],"rejects":["a1","a","aA","abx"]}
+{"regex":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","accepts":["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"],"rejects":["","0","1","X"]}
+{"regex":"(a*)(a|aa)","accepts":["a","aa","aaa","aaaa"],"rejects":["","b","aaab","baaa"]}
+{"regex":"aaa","accepts":["aaa"],"rejects":["","0","1","X"]}
+{"regex":"((a|a)|a)","accepts":["a"],"rejects":["","aa","b","ab"]}
+{"regex":"(a|aa)+b","accepts":["ab","aab","aaab","aaaab"],"rejects":["b","a","aba","ba"]}
+{"regex":"(?=a+)a+","accepts":["a","aa","aaaa"],"rejects":["","b","ab","ba"]}
+{"regex":"(a)?a","accepts":["a","aa"],"rejects":["","0","1","X"]}
+{"regex":"aa","accepts":["aa"],"rejects":["","0","1","X"]}
+{"regex":"(?=a)a","accepts":["a"],"rejects":["","aa","b","ba"]}
+{"regex":"(?=a|ab)ab","accepts":["ab"],"rejects":["","a","abc","b"]}
+{"regex":"(a|ab)+","accepts":["a","ab","aab","aba"],"rejects":["","b","abb","ba"]}
+{"regex":"a|ab","accepts":["a","ab"],"rejects":["","b","aba","ba"]}
+{"regex":"(a)*ab","accepts":["ab","aab","aaab"],"rejects":["","0","1","X"]}
+{"regex":"(aa)(BB)","accepts":["aaBB"],"rejects":["","aaB","aBB","aaBBB"]}
+{"regex":"[Aa][Bb]cd","accepts":["ABcd","Abcd","aBcd","abcd"],"rejects":["","abCD","Acd","abbcd"]}
+{"regex":"[aA]b[cC]","accepts":["abc","abC","Abc","AbC"],"rejects":["","aBc","ABC","abbc"]}
+{"regex":"(a|abcd|african)","accepts":["a","abcd","african"],"rejects":["","b","c","d"]}
+{"regex":"(a+)+","accepts":["a","aa","aaaaaa"],"rejects":["","b","aaab","baaa"]}
+{"regex":"(a+)*","accepts":["","a","aa","aaaa"],"rejects":["b","aaab","baaa","c"]}
+{"regex":"a*","accepts":["","a","aa","aaaa"],"rejects":["b","ab","ba"]}
+{"regex":"a+","accepts":["a","aa","aaaa"],"rejects":["","b","ab","ba"]}
+{"regex":"([a]*)*","accepts":["","a","aa","aaa"],"rejects":["0","1","X","Y"]}
+{"regex":"(a+)","accepts":["a","aa","aaa"],"rejects":["","0","a0","0a"]}
+{"regex":"A*","accepts":["","A","AA","AAA"],"rejects":["a","B","AB","BA"]}
+{"regex":"(a)+","accepts":["a","aa","aaa"],"rejects":["","b","ab","ba"]}
+{"regex":"(a)*","accepts":["","a","aa","aaa"],"rejects":["b","ab","ba","aac"]}
+{"regex":"(a*)*","accepts":["","a","aaaa"],"rejects":["b","aaab","baaa","c"]}
+{"regex":"(((a)))","accepts":["a"],"rejects":["","0","a0","0a"]}
+{"regex":"[a]","accepts":["a"],"rejects":["","0","a0","0a"]}
+{"regex":"A","accepts":["A"],"rejects":["","a","AA","BA"]}
+{"regex":"((a))","accepts":["a"],"rejects":["","aa","ba","ab"]}
+{"regex":"(((((((((a)))))))))","accepts":["a"],"rejects":["","aa","b","ab"]}
+{"regex":"a?","accepts":["","a"],"rejects":["aa","b","ab"]}
+{"regex":"((((((((((a))))))))))","accepts":["a"],"rejects":["","aa","b","ba"]}
+{"regex":"(a)","accepts":["a"],"rejects":["","b","aa","ba"]}
+{"regex":"a","accepts":["a"],"rejects":["","b","aa","ba"]}
+{"regex":"(((((a)))))","accepts":["a"],"rejects":["","b","c","d"]}
+{"regex":"(?=ab|a)ab","accepts":["ab"],"rejects":["","a","abc","cab"]}
+{"regex":"(a)+b|aac","accepts":["ab","aaab","aac"],"rejects":["","a","aaac","baac"]}
+{"regex":"a(?!b)a","accepts":["aa"],"rejects":["","a","ab","aaa"]}
+{"regex":"(?=a)b?a","accepts":["a"],"rejects":["","aa","ba","b"]}
+{"regex":"(a|bab)+","accepts":["ababa","a","aa","aaa"],"rejects":["","0","1","X"]}
+{"regex":"(ab|a)b","accepts":["ab","abb"],"rejects":["a","b","aab","abab"]}
+{"regex":"(ab|a)*b","accepts":["b","ab","aab","abab","abb"],"rejects":["","a","aba","ba"]}
+{"regex":"(ab|ab*)bc","accepts":["abc","abbc","abbbbc"],"rejects":["ab","bc","abb"]}
+{"regex":"(ab|ab*)bc","accepts":["abc","abbc","abbbc"],"rejects":["","ab","ac","abbb","abbbcx"]}
+{"regex":"(ab|ab*)bc","accepts":["abc","abbc","abbbc"],"rejects":["ac","ab","abq","abbb"]}
+{"regex":"(?=ab)a[b-c]","accepts":["ab"],"rejects":["ac","a","abc","cb"]}
+{"regex":"(ab|a)b*c","accepts":["ac","abc","abbc","abbbc"],"rejects":["ab","aabbc","abbcx","bc"]}
+{"regex":"(ab|a)b*c","accepts":["ac","abc","abbc"],"rejects":["ab","abb","bc"]}
+{"regex":"(?!ab)a[b-c]","accepts":["ac"],"rejects":["ab","a","bc","acc"]}
+{"regex":"(ab|a)(bc|c)","accepts":["abc","ac","abbc"],"rejects":["ab","bc","a","abcbc"]}
+{"regex":"(?=(ab|ac))a[b-c]","accepts":["ab","ac"],"rejects":["","aa","ad","abc"]}
+{"regex":"(a)b|ac","accepts":["ab","ac"],"rejects":["","a","abc","ba"]}
+{"regex":"(a)b|(a)c","accepts":["ab","ac"],"rejects":["","a","b","c"]}
+{"regex":"(ab|a)+(?=c)c","accepts":["ac","abc","ababc"],"rejects":["","aba","abbc","cabc"]}
+{"regex":"a+(?!b)","accepts":["a","aa","aaaa"],"rejects":["","ab","aab","ba"]}
+{"regex":"a+|b*","accepts":["","a","aaaa","bbb"],"rejects":["ab","ba","aaab","c"]}
+{"regex":"(a+|b)?","accepts":["","a","aaaa","b"],"rejects":["ab","ba","bb","c"]}
+{"regex":"a+b?","accepts":["a","aa","ab","aaab"],"rejects":["","b","aba","ba"]}
+{"regex":"a*|b*","accepts":["","a","aaa","bbb"],"rejects":["ab","ba","aab","bba"]}
+{"regex":"(a+|b)+","accepts":["a","aa","b","ab","aababb"],"rejects":["","c","abaac","baac"]}
+{"regex":"a*|b","accepts":["aa","","a","b"],"rejects":["0","1","X","Y"]}
+{"regex":"(a+|b)?","accepts":["","a","aa","b"],"rejects":["ab","ba","c","bb"]}
+{"regex":"(ab?)+","accepts":["a","ab","aa","aba","abab"],"rejects":["","b","abb","ba"]}
+{"regex":"ab*","accepts":["a","ab","abb","abbbb"],"rejects":["","b","aa","abba"]}
+{"regex":"a(b)*","accepts":["a","ab","abb","abbb"],"rejects":["","b","c","d"]}
+{"regex":"a(b*)","accepts":["a","ab","abbbb","abb"],"rejects":["bbbbb","","0","a0"]}
+{"regex":"[a]*[b]","accepts":["aab","b","ab","aaab"],"rejects":["","0","1","X"]}
+{"regex":"[ab]+","accepts":["a","ab","bbaa","b"],"rejects":["","0","1","X"]}
+{"regex":"[ab]*","accepts":["","a","ab","bbaa"],"rejects":["0","1","X","Y"]}
+{"regex":"a[-b]","accepts":["a-","ab"],"rejects":["a","ac","a--"]}
+{"regex":"ab?","accepts":["a","ab"],"rejects":["","b","abb","ba"]}
+{"regex":"a+b","accepts":["ab","aaaab","aab","aaab"],"rejects":["aaaacb","b","a","0b"]}
+{"regex":"((a*|b))*","accepts":["","a","b","aa","abaaab"],"rejects":["c","abx","-","ba-c"]}
+{"regex":"(a+|b)+","accepts":["a","b","aaab","abbaaa"],"rejects":["","c","abac","abcx"]}
+{"regex":"(a+|b)*","accepts":["","a","b","aaab","abbaaa"],"rejects":["c","abac","baac","abcx"]}
+{"regex":"(a*|b)*","accepts":["","a","b","aaab","bbbaaa"],"rejects":["c","abac","baac","abcx"]}
+{"regex":"a+|b+","accepts":["a","b","aa","bb"],"rejects":["","0","1","X"]}
+{"regex":"(a+|b)*","accepts":["","a","b","ab","aaab"],"rejects":["c","abaac","baac","abx"]}
+{"regex":"(ab)+","accepts":["ab","abab","ababab"],"rejects":["","a","abb","aba"]}
+{"regex":"(ab)*","accepts":["","ab","abab","ababab"],"rejects":["a","b","aba","abb"]}
+{"regex":"ab+","accepts":["ab","abb","abbbb"],"rejects":["","a","b","aba"]}
+{"regex":"(a)b+","accepts":["ab","abb","abbb"],"rejects":["","a","b","aba"]}
+{"regex":"([ab]*)*","accepts":["","a","b","ab"],"rejects":["c","d","ac","abc"]}
+{"regex":"a?b?","accepts":["","a","b","ab"],"rejects":["c","d","ac","abc"]}
+{"regex":"a[b-]","accepts":["ab","a-"],"rejects":["","a","aa","ac"]}
+{"regex":"((ab))","accepts":["ab"],"rejects":["","0","1","X"]}
+{"regex":"(a)|(b)","accepts":["a","b"],"rejects":["","0","1","X"]}
+{"regex":"[ab]?","accepts":["","a","b"],"rejects":["0","1","X","Y"]}
+{"regex":"a?|b","accepts":["a","","b"],"rejects":["0","1","X","Y"]}
+{"regex":"a[b]","accepts":["ab"],"rejects":["a","b","0b","a0"]}
+{"regex":"(a)(b)","accepts":["ab"],"rejects":["","a","b","abb"]}
+{"regex":"ab","accepts":["ab"],"rejects":["","a","b","abc","cab"]}
+{"regex":"A|(B)","accepts":["A","B"],"rejects":["","AB","BA","b"]}
+{"regex":"a|b","accepts":["a","b"],"rejects":["","ab","c","ba"]}
+{"regex":"a?|b?","accepts":["","a","b"],"rejects":["c","d","ab","ac"]}
+{"regex":"(a|b)*","accepts":["ba","","a","b"],"rejects":["0","1","X","Y"]}
+{"regex":"a*b+","accepts":["b","ab","aaab","aabbb"],"rejects":["","a","ba","bbba"]}
+{"regex":"a*b","accepts":["b","ab","aaab"],"rejects":["","a","ba","aba"]}
+{"regex":"(a*)b+","accepts":["b","ab","aab","bb"],"rejects":["","0","1","X"]}
+{"regex":"(a|b)+","accepts":["bab","a","b","aa"],"rejects":["","0","1","X"]}
+{"regex":"(a?b)+","accepts":["b","ab","bab","abab"],"rejects":["","a","aba","aaab"]}
+{"regex":"a?b","accepts":["b","ab"],"rejects":["","a","aab","bb"]}
+{"regex":"[ab]","accepts":["b","a"],"rejects":["","0","1","X"]}
+{"regex":"(a|b)?","accepts":["b","","a"],"rejects":["0","1","X","Y"]}
+{"regex":"a(?!b)[a-z]","accepts":["aa","ac","az"],"rejects":["a","ab","aA","aca"]}
+{"regex":"abAz","accepts":["abAz"],"rejects":["aAz","abA","bAz","0bAz"]}
+{"regex":"(ab|ba)+","accepts":["ab","ba","abba","baba"],"rejects":["","a","aba","abb"]}
+{"regex":"(ab|ba)","accepts":["ab","ba"],"rejects":["","a","b","aba"]}
+{"regex":"a(?=b)b","accepts":["ab"],"rejects":["","a","abb","ac"]}
+{"regex":"a(?=b)b","accepts":["ab"],"rejects":["a","b","ac","abb"]}
+{"regex":"ab+bc","accepts":["abbc","abbbbc"],"rejects":["abc","abq","bc"]}
+{"regex":"ab+bc","accepts":["abbc","abbbc","abbbbbc"],"rejects":["","abc","abq","bc"]}
+{"regex":"ab+bc","accepts":["abbc","abbbc","abbbbc"],"rejects":["abc","abq","ac","abb"]}
+{"regex":"ab|bc","accepts":["ab","bc"],"rejects":["","0","1","X"]}
+{"regex":"a(bb)c","accepts":["abbc"],"rejects":["","abc","abbbc","aabbc"]}
+{"regex":"ab*bc","accepts":["abc","abbc","abbbbc"],"rejects":["ab","bc","abq"]}
+{"regex":"ab*bc","accepts":["abc","abbc","abbbbc"],"rejects":["ac","abb","abq","abbbx"]}
+{"regex":"ab?bc","accepts":["abc","abbc"],"rejects":["","abbbbc","ab","bc"]}
+{"regex":"ab?bc","accepts":["abc","abbc"],"rejects":["abbbbc","ab","bc"]}
+{"regex":"ab?bc","accepts":["abc","abbc"],"rejects":["abbbbc","ac","abb","abq"]}
+{"regex":"a(?=b)bc","accepts":["abc"],"rejects":["ac","abbc","ab"]}
+{"regex":"a(?!b|bc)[a-z]+","accepts":["ac","adzz","az"],"rejects":["ab","abc","abz","a"]}
+{"regex":"a(?=b|bc)bc","accepts":["abc"],"rejects":["ab","abbc","ac",""]}
+{"regex":"(ab|bc+d)","accepts":["ab","bcd","bccd","bccccd"],"rejects":["","bc","bd","acd"]}
+{"regex":"(ab|bc)(?!de)[a-z][a-z]","accepts":["abfg","bcxy"],"rejects":["","abde","bcde","abf","abcxy"]}
+{"regex":"(ab|bc)(?=de)de","accepts":["abde","bcde"],"rejects":["","ab","bc","abcde","abdef"]}
+{"regex":"[abc]?123","accepts":["123","a123","c123"],"rejects":["","a","b","c"]}
+{"regex":"(a|b)*c|(a|ab)*c","accepts":["c","ac","bc","abc","ababc"],"rejects":["","ab","aba","ca","xc"]}
+{"regex":"(ab|ca)+","accepts":["ab","abca","ca","abab"],"rejects":["","a","b","c"]}
+{"regex":"(a)(b)c|ab","accepts":["abc","ab"],"rejects":["","a","bc","abcd"]}
+{"regex":"(?!abc)ab","accepts":["ab"],"rejects":["","abc","a","xab"]}
+{"regex":"(?!a+b)c+|a+b","accepts":["c","cc","ab","aab","aaab"],"rejects":["ac","bc","a","b"]}
+{"regex":"(a|b)c|a(b|c)","accepts":["ab","ac","bc"],"rejects":["","aa","abc","cc"]}
+{"regex":"(?=a+b+c)a+b+c","accepts":["abc","aabc","aaabbc"],"rejects":["ac","aac","aaabbd","baabc"]}
+{"regex":"(?=abc)abc","accepts":["abc"],"rejects":["ab","abcd",""]}
+{"regex":"(ab)c|abc","accepts":["abc"],"rejects":["ab","ac","abcc","xabc"]}
+{"regex":"(?=(a|b)+c)(a|b)+c","accepts":["ac","bc","abc","bbac"],"rejects":["","c","ab","abca"]}
+{"regex":"(?=(ab)?c)(ab)?c","accepts":["c","abc"],"rejects":["ab","ac","abbc","cc"]}
+{"regex":"ab(cab|cat)","accepts":["abcab","abcat"],"rejects":["abca","abcax","ab","cab"]}
+{"regex":"ab(cab|ca)x","accepts":["abcabx","abcax"],"rejects":["abcab","abcatx","abcaxx","abx"]}
+{"regex":"(abc|ab[cd])","accepts":["abc"],"rejects":["","a","b","c"]}
+{"regex":"(?!abc|abd)ab[a-z]","accepts":["aba","abe","abz"],"rejects":["abc","abd","ab","ab1"]}
+{"regex":"(?=abc|abd)ab[c-d]","accepts":["abc","abd"],"rejects":["abe","ab","abcd",""]}
+{"regex":"abc|abd","accepts":["abc","abd"],"rejects":["ab","abe","abcd",""]}
+{"regex":"abc|abd|aef|bcx|bcy","accepts":["abc","abd","aef","bcx","bcy"],"rejects":["abe","bc","bcz","aefx",""]}
+{"regex":"(?!(ab)?c)[a-c]+","accepts":["ab","ac","bca"],"rejects":["","c","abc","cab"]}
+{"regex":"abc*","accepts":["ab","abc","abcc","abccc"],"rejects":["a","b","0b","a0"]}
+{"regex":"a+b+c","accepts":["abc","aabbc","aaabbbc"],"rejects":["ac","abb","bc"]}
+{"regex":"a+bc","accepts":["abc","aabc","aaabc"],"rejects":["bc","ab","0bc","a0c"]}
+{"regex":"a+b+c","accepts":["abc","aabc","abbc","aaabbc"],"rejects":["","ac","ab","abbcc"]}
+{"regex":"ab+c","accepts":["abc","abbc","abbbbbc"],"rejects":["ac","ab","abb","xabc"]}
+{"regex":"(abc)+","accepts":["abc","abcabc","abcabcabc"],"rejects":["","ab","abcab","abca"]}
+{"regex":"(abc)*","accepts":["","abc","abcabc"],"rejects":["ab","abca","aabc"]}
+{"regex":"(a|bc)*","accepts":["","a","bc","abc","bca"],"rejects":["b","c","acb","ba"]}
+{"regex":"[abc]*","accepts":["abc","","a","b"],"rejects":["0","1","X","Y"]}
+{"regex":"ab|c*","accepts":["ab","","c","cc"],"rejects":["a","abc","ca","d"]}
+{"regex":"(a)(bc)","accepts":["abc"],"rejects":["","0","1","X"]}
+{"regex":"a(b)(c)","accepts":["abc"],"rejects":["","0","1","X"]}
+{"regex":"abc","accepts":["abc"],"rejects":["","0","1","X"]}
+{"regex":"(abc)?","accepts":["","abc"],"rejects":["ab","abcabc","a"]}
+{"regex":"(a)b(c)","accepts":["abc"],"rejects":["","ab","bc","xabc"]}
+{"regex":"ABC","accepts":["ABC"],"rejects":["abc","","0","1"]}
+{"regex":"((a)|(b)|(c))","accepts":["a","b","c"],"rejects":["","ab","ca","d"]}
+{"regex":"((a)|(b)|(c))","accepts":["a","b","c"],"rejects":["","ab","d","aa"]}
+{"regex":"a(b)c","accepts":["abc"],"rejects":["","ac","abbc","abcc"]}
+{"regex":"a|bc","accepts":["a","bc"],"rejects":["","b","c","abc"]}
+{"regex":"a|(b)c","accepts":["a","bc"],"rejects":["cat","xbcom","","0"]}
+{"regex":"[abc]","accepts":["a","b","c"],"rejects":["","d","ab","A"]}
+{"regex":"a|b|c","accepts":["a","b","c"],"rejects":["","d","ab","ac"]}
+{"regex":"[abc]?","accepts":["","a","b","c"],"rejects":["d","ab","ac","abc"]}
+{"regex":"ab*c","accepts":["ac","abc","abbbc"],"rejects":["","ab","abb","cabc"]}
+{"regex":"ab?c","accepts":["ac","abc"],"rejects":["abbc","ab","a",""]}
+{"regex":"((a)(b)?(c))","accepts":["ac","abc"],"rejects":["","a","b","c"]}
+{"regex":"(a|b)+c","accepts":["ac","bc","abc","bbac"],"rejects":["","c","ab","abca"]}
+{"regex":"([ab]c)+","accepts":["ac","bc","acbc","bcac"],"rejects":["","a","abc","acc"]}
+{"regex":"(a|b?c)+","accepts":["a","c","bc","acbc"],"rejects":["","b","ab","cb"]}
+{"regex":"a(?!b)c","accepts":["ac"],"rejects":["ab","abc","aac"]}
+{"regex":"a(?!b)c","accepts":["ac"],"rejects":["","abc","abbc","ab"]}
+{"regex":"a*bc","accepts":["bc","abc","aabc","aaabc"],"rejects":["b","c","0c","b0"]}
+{"regex":"(ab)?c","accepts":["c","abc"],"rejects":["","ab","abbc","ac"]}
+{"regex":"(a)(b)|(c)","accepts":["c","ab"],"rejects":["","a","b","d"]}
+{"regex":"(a*|b*)c","accepts":["c","ac","aaac","bbbc"],"rejects":["","ab","baac","cc"]}
+{"regex":"(a|b)*[c]","accepts":["c","ac","bbc","ababc"],"rejects":["","ab","cab"]}
+{"regex":"(a|b)?c","accepts":["c","ac","bc"],"rejects":["","abc","cc","ca"]}
+{"regex":"(a|b)(?!c)[a-z]","accepts":["aa","ab","bd"],"rejects":["ac","bc","a","abc"]}
+{"regex":"a(?!b|c)[a-z]","accepts":["aa","ad","az"],"rejects":["ab","ac","a1","add"]}
+{"regex":"a(?=b|c)[a-z]","accepts":["ab","ac"],"rejects":["","a","ad","abc"]}
+{"regex":"(abc|a+z)","accepts":["abc","az","aaaz"],"rejects":["ab","aazz","z"]}
+{"regex":"a(?!b*c)[a-z]+","accepts":["abx","azz","abbx"],"rejects":["ac","abc","abbc","a"]}
+{"regex":"abc|bac","accepts":["abc","bac"],"rejects":["ab","bc","0bc","a0c"]}
+{"regex":"(abc|bac)","accepts":["abc","bac"],"rejects":["","ab","bca","abca"]}
+{"regex":"(abc|bac|ca|cb)","accepts":["abc","bac","ca","cb"],"rejects":["ab","ba","cab",""]}
+{"regex":"a(?=b|c)b","accepts":["ab"],"rejects":["","a","ac","abb"]}
+{"regex":"a(?=[bc])b","accepts":["ab"],"rejects":["","ac","abc","b"]}
+{"regex":"a(?=b|c)(b|c)","accepts":["ab","ac"],"rejects":["","a","aa","ad","abc"]}
+{"regex":"a(bc|b)c","accepts":["abc","abcc"],"rejects":["ab","abbc","ac","abccc"]}
+{"regex":"a(?=bc)bc","accepts":["abc"],"rejects":["ab","abbc","ac","xbc"]}
+{"regex":"a(?=b*c)b*c","accepts":["ac","abc","abbbc"],"rejects":["ab","abbx","a","abbcd"]}
+{"regex":"abc|bcd","accepts":["abc","bcd"],"rejects":["xyzabcd","xyzabcdef","ab","bc"]}
+{"regex":"a(?!bc)b[c-d]","accepts":["abd"],"rejects":["abc","ab","abdc","aBd"]}
+{"regex":"([abc])*bcd","accepts":["bcd","abcd","aabcbcd"],"rejects":["","abcbd","abcdx","d"]}
+{"regex":"([abc])*bcd","accepts":["bcd","abcd","abcbcd"],"rejects":["","abc","aacd","bcdd"]}
+{"regex":"a(bc+|b[eh])g","accepts":["abcg","abccg","abeg","abhg"],"rejects":["","abg","abdg","abc"]}
+{"regex":"a([bc]*)c*","accepts":["a","ab","ac","abc","abcc"],"rejects":["","ba","ad","abdc"]}
+{"regex":"a([bc]*)c*","accepts":["a","abc","abcc","abcbcc"],"rejects":["","ba","ad","abdc"]}
+{"regex":"ab(?=c)c","accepts":["abc"],"rejects":["","ab","ac","abcc"]}
+{"regex":"(a|b)(?=c)c","accepts":["ac","bc"],"rejects":["ab","cc","abc","c"]}
+{"regex":"a(?=b|c)c","accepts":["ac"],"rejects":["","ab","ad","acc"]}
+{"regex":"([ab]*)(?=c)c","accepts":["c","ac","aabbc"],"rejects":["","ab","aabbd","cc"]}
+{"regex":"([ab]*)?(?=c)c","accepts":["c","ac","aabbc"],"rejects":["","ab","cc","aabbd"]}
+{"regex":"(a+|b+|c+)*c","accepts":["c","ac","abc","bc"],"rejects":["","a","b","d"]}
+{"regex":"(ABC|CDA|BC)X","accepts":["ABCX","CDAX","BCX"],"rejects":["AX","CDA","BC"]}
+{"regex":"a([bc]*)(c*d)","accepts":["abcd","abd","abccd","acccd"],"rejects":["","abc","accc","abce","a"]}
+{"regex":"ab(?=c)cd","accepts":["abcd"],"rejects":["","abdc","abc","abccd"]}
+{"regex":"a([bc]+)(c*d)","accepts":["abd","abcd","abccd","abcccd"],"rejects":["ad","abce","abc",""]}
+{"regex":"a([bc]*)(c+d)","accepts":["acd","abcd","abccd","abcccd"],"rejects":["ad","abd","abc",""]}
+{"regex":"(abc|(c|dc))","accepts":["abc","c","dc"],"rejects":["ab","bc","0bc","a0c"]}
+{"regex":"[abcd]+","accepts":["a","abcd","dcba"],"rejects":["","e","abce","A"]}
+{"regex":"ab+|cd?","accepts":["ab","abb","c","cd"],"rejects":["a","ad","cdd","abcd"]}
+{"regex":"abcd*","accepts":["abc","abcd","abcdd","abcddd"],"rejects":["ab","bc","0bc","a0c"]}
+{"regex":"ab|cd*","accepts":["ab","c","cd","cdd"],"rejects":["","a","ad","abcd"]}
+{"regex":"(ab|cd)+","accepts":["ab","cd","abcd","cdab"],"rejects":["","a","abc","cda"]}
+{"regex":"(ab|cd)*","accepts":["","ab","cd","abcd","cdab"],"rejects":["a","abc","cda","abdc"]}
+{"regex":"(ab|cd)?","accepts":["","ab","cd"],"rejects":["a","abc","abcd","cda"]}
+{"regex":"ab|cd","accepts":["ab","cd"],"rejects":["a","b","abcd","ad"]}
+{"regex":"((a)(b)c)(d)","accepts":["abcd"],"rejects":["abc","abd","aabcd"]}
+{"regex":"(a)bc(d)","accepts":["abcd"],"rejects":["","abc","abd","abcdd"]}
+{"regex":"((a)(b)c)(d)","accepts":["abcd"],"rejects":["","abc","abd","zabcd"]}
+{"regex":"(abcd)","accepts":["abcd"],"rejects":["abc","bcd","0bcd","a0cd"]}
+{"regex":"a(b)c(d)","accepts":["abcd"],"rejects":["abc","bcd","0bcd","a0cd"]}
+{"regex":"ab(cd)","accepts":["abcd"],"rejects":["abc","bcd","0bcd","a0cd"]}
+{"regex":"a(bc)d","accepts":["abcd"],"rejects":["ABCD","abc","bcd","0bcd"]}
+{"regex":"abcd","accepts":["abcd"],"rejects":["ABCD","xyz","XabcdYabcdZ","pqrs"]}
+{"regex":"(a|[bcd])","accepts":["a","b","c","d"],"rejects":["","ab","e"]}
+{"regex":"a|[bcd]","accepts":["a","b","c","d"],"rejects":["","ab","e"]}
+{"regex":"[abcd]","accepts":["a","b","c","d"],"rejects":["","ab","e","da"]}
+{"regex":"a[bc]d","accepts":["abd","acd"],"rejects":["abc","ad","aed"]}
+{"regex":"a(b|c)d","accepts":["abd","acd"],"rejects":["ad","abcd","aed","ab"]}
+{"regex":"a[bc]d","accepts":["abd","acd"],"rejects":["","ad","aed","abcd"]}
+{"regex":"(a+|b+)[cd]","accepts":["ac","ad","aac","aad"],"rejects":["a","c","d","0c"]}
+{"regex":"(a|b)(c|d)","accepts":["ac","ad","bc","bd"],"rejects":["a","c","abc","cd"]}
+{"regex":"((a|b)c)|d","accepts":["ac","bc","d"],"rejects":["","abc","cd"]}
+{"regex":"((a|b)c)|d","accepts":["ac","bc","d"],"rejects":["","a","c","dc"]}
+{"regex":"a(b|c)?d","accepts":["ad","abd","acd"],"rejects":["","abcd","aed","abbd"]}
+{"regex":"(a|b)c*d","accepts":["ad","acd","acccd","bd","bcccd"],"rejects":["abcd","a","cd","ab"]}
+{"regex":"(a|b)c*d","accepts":["ad","acd","accd","bcccd"],"rejects":["","abcd","a","cd","bdc"]}
+{"regex":"(a|b)c*d","accepts":["ad","acd","accd","bcccd"],"rejects":["","abcd","bdc"]}
+{"regex":"(a|b)c*d","accepts":["ad","acd","bcccd"],"rejects":["","abcd","bdc","cd"]}
+{"regex":"([ab]|c)+d","accepts":["ad","bd","cd","abcd","ccbd"],"rejects":["","d","abce","abcdd"]}
+{"regex":"(a|b|c)d","accepts":["ad","bd","cd"],"rejects":["","d","abcd","ed","abd"]}
+{"regex":"a(?!b|c)d","accepts":["ad"],"rejects":["","ab","ac","add"]}
+{"regex":"a(?![bc])d","accepts":["ad"],"rejects":["","abd","acd","add"]}
+{"regex":"a*[bcd]","accepts":["b","c","d","ab"],"rejects":["","0","b0","0b"]}
+{"regex":"(a*|b+)[cd]","accepts":["c","ac","bbc","bbd"],"rejects":["","a","b","bdc"]}
+{"regex":"(a+|b*)[cd]","accepts":["c","d","ac","ad"],"rejects":["","0","c0","0c"]}
+{"regex":"(a*|b*)[cd]","accepts":["c","d","ac","bc"],"rejects":["","a","b","ab"]}
+{"regex":"(A|B)*CD","accepts":["CD","ACD","BBCD","ABABCD"],"rejects":["","a","b","c"]}
+{"regex":"([abc])*d","accepts":["d","ad","abbbcd"],"rejects":["","abbbc","de","abcdx"]}
+{"regex":"([abc])*d","accepts":["d","ad","abcd","abbbcd"],"rejects":["","abbbce","da","abcdd"]}
+{"regex":"(a|bc)*d","accepts":["d","ad","bcd","abcd","abcad"],"rejects":["","ab","bd","dc","bca"]}
+{"regex":"(a|bc)?d","accepts":["d","ad","bcd"],"rejects":["","bd","abcd","bcdc"]}
+{"regex":"(?!(ab|cd)+)[a-d]+","accepts":["a","ac","cb","dc"],"rejects":["","ab","cd","abcd","cdab"]}
+{"regex":"a(?!(b|c)d)[a-z][a-z]","accepts":["aee","abx","acz"],"rejects":["","abd","acd","ab"]}
+{"regex":"a(?=(b|c)d)[bc]d","accepts":["abd","acd"],"rejects":["","ad","abcd","aed"]}
+{"regex":"ab(?=cd)cd","accepts":["abcd"],"rejects":["","abc","abdc","abccd","xabcd"]}
+{"regex":"a[bcd]+dcdcde","accepts":["abdcdcde","acdcdcde","abbdcdcde"],"rejects":["","adcdcde","abcecdcde","bdcdcde"]}
+{"regex":"a[bcd]*dcdcde","accepts":["adcdcde","abdcdcde","abbdcdcde"],"rejects":["","dcdcde","adcdcdef","abcecdcde"]}
+{"regex":"(abc|(d|de)c)","accepts":["abc","dc","dec"],"rejects":["ab","bc","0bc","a0c"]}
+{"regex":"(?=(ab|cd)+e)(ab|cd)+e","accepts":["abe","cde","abcde","cdabe"],"rejects":["ab","abcd","e","abcdex"]}
+{"regex":"abc[de]*","accepts":["abc","abcd","abce","abcdd"],"rejects":["ab","bc","0bc","a0c"]}
+{"regex":"a(b)c(d)e","accepts":["abcde"],"rejects":["abcd","bcde","0bcde","a0cde"]}
+{"regex":"a(bc)(DE)","accepts":["abcDE"],"rejects":["abcD","bcDE","0bcDE","a0cDE"]}
+{"regex":"abcde","accepts":["abcde"],"rejects":["abcdfe","abcd","bcde","0bcde"]}
+{"regex":"a|b|c|d|e","accepts":["a","b","c","d","e"],"rejects":["","ab","ee","f"]}
+{"regex":"a(b|c)+(d|e)","accepts":["abd","ace","abbd","acccce"],"rejects":["","ad","ab","abcex","aed"]}
+{"regex":"(ab|cd)e","accepts":["abe","cde"],"rejects":["","ab","cd","abcde","de"]}
+{"regex":"((ab)|cd)e","accepts":["abe","cde"],"rejects":["","ab","cd","e","abcde"]}
+{"regex":"[abc]+DE","accepts":["aDE","abcDE","cbaDE"],"rejects":["","DE","abcdDE","abde"]}
+{"regex":"([ab]|cd)+e","accepts":["ae","be","cde","abcde"],"rejects":["","e","ab","cd","acd"]}
+{"regex":"([ab]|cd)?e","accepts":["e","ae","be","cde"],"rejects":["","ab","ace","cdcd"]}
+{"regex":"(?!(ab|cd)+e)[a-e]+","accepts":["ab","abcd","e","cda"],"rejects":["abe","cde","abcde",""]}
+{"regex":"abcdefab","accepts":["abcdefab"],"rejects":["abcdefa","bcdefab","0bcdefab","a0cdefab"]}
+{"regex":"abcdef","accepts":["abcdef"],"rejects":["abcde","bcdef","0bcdef","a0cdef"]}
+{"regex":"ab(?!cd)ef","accepts":["abef"],"rejects":["","abcdef","abcd","abefg","zabef"]}
+{"regex":"(a|bc)+(d|ef)","accepts":["ad","aef","bcad","bcbcef"],"rejects":["","a","bc","abcdef","bcae"]}
+{"regex":"(a|b|c|d|e)f","accepts":["af","bf","ef"],"rejects":["f","ff","zf"]}
+{"regex":"ab(?=cd|ef)(cd|ef)","accepts":["abcd","abef"],"rejects":["","ab","abce","abcdef"]}
+{"regex":"abcd*efg","accepts":["abcefg","abcdefg","abcddefg"],"rejects":["","abcdeg","abcdfg","zabcdefg"]}
+{"regex":"abcd*efg","accepts":["abcefg","abcdefg","abcddefg"],"rejects":["abcdeg","abcfg","abcd"]}
+{"regex":"(a|bc|def)g","accepts":["ag","bcg","defg"],"rejects":["","g","abcg"]}
+{"regex":"(a|bc|def)g","accepts":["ag","bcg","defg"],"rejects":["","g","abcg","dg"]}
+{"regex":"(ab|cd)+(ef|gh)","accepts":["abef","cdgh","abcdabef","cdabgh"],"rejects":["","ab","ef","abcdn","abefgh"]}
+{"regex":"ab(?!cd|ef)gh","accepts":["abgh"],"rejects":["","abcdgh","abefgh","agh"]}
+{"regex":"abc(def|ghi)","accepts":["abcdef","abcghi"],"rejects":["abc","def","abcxyz","xabcdef"]}
+{"regex":"((a|b|c|d|e|f|g|h|i|j|k|l|m|n)+)?","accepts":["abcde","","a","b"],"rejects":["0","1","X","Y"]}
+{"regex":"a|b|cd|efg|h|ijk|lmn|o|pq|rstuvwx|yz","accepts":["a","b","cd"],"rejects":["","0","1","X"]}
+{"regex":"(abc|def)x","accepts":["abcx","defx"],"rejects":["","abc","def","xabc"]}
+{"regex":"(ab*(cd|ef))+X","accepts":["acdX","aefX","abcdX","abefX"],"rejects":["X","acd","cdX","0cdX"]}
+{"regex":"(abc|def|xyz)","accepts":["abc","xyz"],"rejects":["","a","b","c"]}
+{"regex":"(abc|)ef","accepts":["ef","abcef"],"rejects":["","abc","def","abef","abcdef"]}
+{"regex":"abc(?!pqr)","accepts":["abc"],"rejects":["","abcpqr","abcx","zabc"]}
+{"regex":"abc(?=pqr)pqr","accepts":["abcpqr"],"rejects":["","abc","abcpq","abcpqrx","abcxyz"]}
+{"regex":"abc(?=pqr)pqr","accepts":["abcpqr"],"rejects":["abc","abcxyz","pqr"]}
+{"regex":"abc(?!pqr)xyz","accepts":["abcxyz"],"rejects":["abcpqrxyz","abc","xyz"]}
+{"regex":"([abc]*)x","accepts":["x","ax","abcx","cccbx"],"rejects":["","abc","abxd","y"]}
+{"regex":"a(b)c|xyz","accepts":["abc","xyz"],"rejects":["","a","b","c"]}
+{"regex":"a[b-d]","accepts":["ab","ac","ad"],"rejects":["","a","ae","abc"]}
+{"regex":"a(?!b)d","accepts":["ad"],"rejects":["","abd","ab","add"]}
+{"regex":"a[b-d]+e","accepts":["abe","ace","abcde"],"rejects":["ae","abf","ab",""]}
+{"regex":"a[b-d]e","accepts":["abe","ace","ade"],"rejects":["","aae","aee","abd"]}
+{"regex":"a[b-d]*e","accepts":["ae","abe","abcde","adcbde"],"rejects":["abf","aBde","ab",""]}
+{"regex":"[abhgefdc]ij","accepts":["aij","bij","cij","hij"],"rejects":["","ij","kij","hijk"]}
+{"regex":"[abhgefdc]ij","accepts":["aij","hij","dij"],"rejects":["ij","kij","ahij"]}
+{"regex":"(ab)x|ab","accepts":["abx","ab"],"rejects":["bx","0bx","a0x","ab0"]}
+{"regex":"(a)(b)x|abc","accepts":["abx","abc"],"rejects":["ab","bx","0bx","a0x"]}
+{"regex":"(ab|x)(c|de)","accepts":["abc","abde","xc","xde"],"rejects":["ab","ac","x","xdc","abdc"]}
+{"regex":"(ab|x)?(c|z)?","accepts":["","ab","x","c","z","abc","abz","xc","xz"],"rejects":["ax","cz","abcz","xx"]}
+{"regex":"ab[xyz]","accepts":["abx","aby","abz"],"rejects":["ab","bx","0bx","a0x"]}
+{"regex":"abz","accepts":["abz"],"rejects":["ab","bz","0bz","a0z"]}
+{"regex":"a*(b+)(z)(z)","accepts":["bzz","abzz","bbzz","aabzz"],"rejects":["","a","b","c"]}
+{"regex":"([a-c][0-2])+","accepts":["a0","b1c2","c2a0b1"],"rejects":["","a","03","a3","A0"]}
+{"regex":"[a-c]+","accepts":["a","abc","cba","bbccaa"],"rejects":["","d","abcd","A"]}
+{"regex":"ac*","accepts":["a","ac","acc","accc"],"rejects":["","0","a0","0a"]}
+{"regex":"[a-c]","accepts":["a","b","c"],"rejects":["","d","A","aa"]}
+{"regex":"a[-]?c","accepts":["ac","a-c"],"rejects":["abc","a--c","c"]}
+{"regex":"[aC]","accepts":["a","C"],"rejects":["","0","a0","0a"]}
+{"regex":"[a-c]at","accepts":["aat","bat","cat"],"rejects":["","at","dat","catt"]}
+{"regex":"a(?!c)b","accepts":["ab"],"rejects":["","ac","acb","abb"]}
+{"regex":"(?=:):","accepts":[":"],"rejects":["",":a","a:","::"]}
+{"regex":"[a-c]+d","accepts":["abcd"],"rejects":["","a","b","c"]}
+{"regex":"[a-c]*d","accepts":["d","ad","abcd","ccbd"],"rejects":["","abc","ed","da"]}
+{"regex":"[a-c]?d","accepts":["d"],"rejects":["","a","b","c"]}
+{"regex":"(?=[a-c]+d)[a-c]+d","accepts":["ad","abcd","ccbd"],"rejects":["d","ed","abc","abcde"]}
+{"regex":"a(?!c|d)b","accepts":["ab"],"rejects":["","acb","adb","aab"]}
+{"regex":"a(?=c|d)[cd]","accepts":["ac","ad"],"rejects":["","ab","acd","adc"]}
+{"regex":"a(?=c|d)d","accepts":["ad"],"rejects":["","a","ac","acd"]}
+{"regex":"([a-c]|d?e)+","accepts":["a","e","de","ade"],"rejects":["","d","ed","aeed"]}
+{"regex":"([a-c]+)(?!de)[a-z][a-z]","accepts":["abxy","cazz","acfg"],"rejects":["","acde","abcde","a1","ab123"]}
+{"regex":"([a-c]+)(?=de)de","accepts":["ade","bcde","abcde"],"rejects":["","de","abc","acdf","abcdee"]}
+{"regex":"([a-c]+)(de|fg)","accepts":["ade","bcfg","abcde","cccfg"],"rejects":["","de","adg","abc","abcdex"]}
+{"regex":"[acegikmoqsuwy]+","accepts":["ace","y","a","c"],"rejects":["","0","1","X"]}
+{"regex":"([ac])+x","accepts":["ax","cx","aacx","cacx"],"rejects":["","x","abx","aacy"]}
+{"regex":"([a-c]|[x-z])[0-9]","accepts":["a0","c9","x3","z7"],"rejects":["","aa","0a","d1","x"]}
+{"regex":"([a-c]+|[x-z]+)[0-9]?","accepts":["abc","xyz","abc7","z9"],"rejects":["","abcxyz","7","ABC"]}
+{"regex":"([a-c]+|[x-z]+)([0-9]|[A-Z])","accepts":["abc7","xyzZ","cA","x0"],"rejects":["abc","abcz7","w1","ABC7"]}
+{"regex":"[A-C]+|[x-z]+","accepts":["A","ABC","x","zyx"],"rejects":["D","a","ABCx",""]}
+{"regex":"([a-c]|[x-z])+","accepts":["a","cz","xyz","abcxyz"],"rejects":["","d","w","azd"]}
+{"regex":"([a-c][x-z])+","accepts":["ax","by","cz","axby","czax"],"rejects":["","a","xy","axc","dx"]}
+{"regex":"([a-c][x-z])*","accepts":["","ax","bycz","czax"],"rejects":["a","xy","azx","dx"]}
+{"regex":"[A-C][x-z]+","accepts":["Ax","Byz","Czz"],"rejects":["Dx","A","ax","Axy1"]}
+{"regex":"([a-c]|[x-z])+","accepts":["a","xz","cza"],"rejects":["","d","w","axw"]}
+{"regex":"[a-c]*[x-z]+","accepts":["x","abcxyz","ccz","ay"],"rejects":["","abc","dx","xyc"]}
+{"regex":"(?=[a-c][x-z])[a-c][x-z]","accepts":["ax","by","cz"],"rejects":["a","azx","dx","ayz"]}
+{"regex":"([a-c]|[x-z])+?(?!de)[a-z][a-z]","accepts":["abfg","xzqq","caxy"],"rejects":["","abde","xzde","a","wxqq"]}
+{"regex":"([a-c]|[x-z])+?(?=de)de","accepts":["ade","xzde","acxzde"],"rejects":["","de","abcdf","acxzdee","wde"]}
+{"regex":"([a-c]+|[x-z]+)+(mn|pq)","accepts":["abcmn","xyzpq","abcxyzmn"],"rejects":["","mn","abcpqz","abdmn","abcxyz"]}
+{"regex":"[aCz]","accepts":["a","C","z"],"rejects":["","0","a0","0a"]}
+{"regex":"([a-c])+z","accepts":["az","abz","ccz"],"rejects":["","z","adz","abczx"]}
+{"regex":"[a-d]+","accepts":["a","abcd","dcba","bbb"],"rejects":["","e","abce","A"]}
+{"regex":"a(?=d)d","accepts":["ad"],"rejects":["","ab","acd","add"]}
+{"regex":"a+hello","accepts":["ahello","aahello","aaahello"],"rejects":["","hello","bhello","ahelloo"]}
+{"regex":"a*hello","accepts":["hello","ahello","aaahello"],"rejects":["","bhello","helloa","ahelloo"]}
+{"regex":"anything","accepts":["anything"],"rejects":["anythin","nything","0nything","a0ything"]}
+{"regex":"[AskZ]+","accepts":["AskZ","A","s","k"],"rejects":["aSKz","","0skZ","A0kZ"]}
+{"regex":"AskZ","accepts":["AskZ"],"rejects":["","Ask","askZ","AskZZ"]}
+{"regex":"(a|x)*ab","accepts":["ab","aab","xxab","xab"],"rejects":["","0","1","X"]}
+{"regex":"(a)+x","accepts":["ax","aax","aaax"],"rejects":["","a","x","aaaxy"]}
+{"regex":"[a-z][0-9]","accepts":["a0","z9","m5"],"rejects":["","A0","aa","a00"]}
+{"regex":"([a-z][0-9])+","accepts":["a1","a1b2","z9a0"],"rejects":["","a","1","a1b"]}
+{"regex":"([a-z][0-9])*","accepts":["","a1","a1b2","z9a0"],"rejects":["a","1a","a12","aa11"]}
+{"regex":"([a-z][0-9])?","accepts":["","a1","z9"],"rejects":["a","1","a1b2","aa"]}
+{"regex":"([a-z]|[0-9])*","accepts":["","abc","123","a1b2"],"rejects":["A","_","abc-","aB"]}
+{"regex":"([a-z]+)(?![0-9])","accepts":["abc","z","abcxyz"],"rejects":["","abc1","1abc"]}
+{"regex":"(?![A-Z]+[0-9]+)([A-Z]|[0-9])+","accepts":["ABC","123ABC","123"],"rejects":["ABC123","Z9","A1",""]}
+{"regex":"(?=[A-Z]+[0-9]+)([A-Z]|[0-9])+","accepts":["ABC123","Z9","A1B2"],"rejects":["ABC","123ABC","abc123",""]}
+{"regex":"(?![a-z]+[0-9])([a-z]|[0-9])+","accepts":["abc","1a","123"],"rejects":["abc1","a9","z9",""]}
+{"regex":"(?=[a-z]+[0-9])([a-z]|[0-9])+","accepts":["abc1","a1","z9","abc123"],"rejects":["abc","1a","123",""]}
+{"regex":"([a-z]|[0-9])+(foo|bar)","accepts":["afoo","123bar","a1b2foo"],"rejects":["","foo","a1b2","Afoo","a1b2baz"]}
+{"regex":"([A-Z]|[0-9])+x","accepts":["Ax","9x","A0Z9x","123x"],"rejects":["","x","ax","A0x1","A_"]}
+{"regex":"[a-zABC]+","accepts":["abc","ABC","AzC","cab"],"rejects":["","D","aD","123"]}
+{"regex":"[a-z]+","accepts":["a","b","c","m"],"rejects":["AaAaA","","0","1"]}
+{"regex":"[A-Z]","accepts":["A","M","Z"],"rejects":["","a","AA","0"]}
+{"regex":"[A-Z]+","accepts":["A","XYZ","M","X"],"rejects":["","0","1","a"]}
+{"regex":"[a-z]","accepts":["t","a","b","c"],"rejects":["","0","1","X"]}
+{"regex":"([a-z]+|[A-Z]+)[0-9][0-9]","accepts":["abc12","XYZ99","z00","QW34"],"rejects":["abc","Ab12","1234","abc123"]}
+{"regex":"([a-z]|[A-Z])[0-9]+","accepts":["a1","Z99","M0"],"rejects":["aa1","11","a","A"]}
+{"regex":"([a-z][a-z0-9]*,)+","accepts":["a5,","a5,b7,","z0,x9,"],"rejects":["","A5,","a5","a5,b7"]}
+{"regex":"([a-z][a-z0-9]*,)+","accepts":["a5,","a5,b7,","z0,x9,"],"rejects":["","A5,","a5,b7"]}
+{"regex":"[a-z][a-z0-9]*","accepts":["a","a5","abc123","z0z9"],"rejects":["","1a","A1","a_"]}
+{"regex":"([a-z][a-z0-9]*,)+","accepts":["a,","a5,b7,c9,","abc123,"],"rejects":["","a5","5a,","a5,b7,c9"]}
+{"regex":"[a-z][a-z0-9]*","accepts":["a","a5","z9x0"],"rejects":["","A5","5a"]}
+{"regex":"([A-Z]|[a-z])+[0-9]?","accepts":["A","abc","AbC9","z0"],"rejects":["","9","a-1","ab12"]}
+{"regex":"([A-Z]|[a-z])+(?!99)[0-8][0-8]","accepts":["a00","Z88","AbC42"],"rejects":["","A99","abc9","1A00","AbC420"]}
+{"regex":"([A-Z]|[a-z])+(?=99)99","accepts":["a99","Z99","AbC99"],"rejects":["","99","A9","AbC999","1A99"]}
+{"regex":"([A-Z][a-z]?)+","accepts":["A","Ab","AbCd","XyZ"],"rejects":["","ab","A1","Abc","abc"]}
+{"regex":"[a-zA-Z]+","accepts":["a","ABC","AbCd"],"rejects":["","abc1","123","_"]}
+{"regex":"[a-z]+[A-Z]?","accepts":["a","abc","abcZ","zQ"],"rejects":["","ABC","abcZZ","abc1"]}
+{"regex":"([A-Z]|[a-z])+","accepts":["A","abc","Zz"],"rejects":["","0","a1","-"]}
+{"regex":"[a-z]*[A-Z]+","accepts":["A","abcZ","zzQW"],"rejects":["","abc","Abc","abc1"]}
+{"regex":"[A-Z]+[a-z]+","accepts":["Aa","XYZabc","Qz"],"rejects":["","abc","XYZ","Aa1"]}
+{"regex":"[A-Z][a-z]*","accepts":["A","Az","Hello","Zebra"],"rejects":["","a","ABC","A1"]}
+{"regex":"[a-zA-Z]+","accepts":["abc","XYZ","aZbY"],"rejects":["","abc1","1abc","ab_"]}
+{"regex":"[A-Z][a-z]+","accepts":["Ab","Zed","Hello"],"rejects":["","A","ab","ABC","A1"]}
+{"regex":"([a-z][A-Z])+","accepts":["aZ","aZbY","mNqR"],"rejects":["","az","AZ","aZb"]}
+{"regex":"([A-Z][a-z])+","accepts":["Az","By","AzBy","QwEr"],"rejects":["","A","az","AB","AzB"]}
+{"regex":"[a-z][A-Z]","accepts":["aZ","mN","zA"],"rejects":["","az","AZ","aZZ"]}
+{"regex":"(?![A-Z]+)[a-zA-Z]+","accepts":["abc","aBC","zZ"],"rejects":["","ABC","Abc","Z"]}
+{"regex":"[a-zA-Z_][a-zA-Z0-9_]*","accepts":["alpha","Alpha9","_tmp2"],"rejects":["","9alpha","alpha-1","alpha beta"]}
+{"regex":"[a-zA-Z_][a-zA-Z0-9_]*","accepts":["alpha","Z9","_tmp2"],"rejects":["","9alpha","a-b","two words"]}
+{"regex":"[A-Za-z_][A-Za-z0-9_]*","accepts":["alpha","Z9_","x"],"rejects":["","9alpha","-x","a-b"]}
+{"regex":"([a-z]|[A-Z])([a-z]|[A-Z]|[0-9])*","accepts":["a","Z9","Abc123","x0Y"],"rejects":["","9a","_a","a-1"]}
+{"regex":"(?=[A-Z][a-z]+)[A-Z][a-z]+","accepts":["Ab","Hello","Zebra"],"rejects":["","A","hello","Hello1"]}
+{"regex":"([a-z]+|[A-Z]+)(?=baz)baz","accepts":["abcbaz","XYZbaz"],"rejects":["Abcbaz","abz","XYZbar","baz"]}
+{"regex":"([a-z][a-z])(?!end)[a-z][a-z][a-z]","accepts":["abxyz","zzabc","ababc"],"rejects":["abend","zzend","abxy",""]}
+{"regex":"([a-z][a-z])(?=end)end","accepts":["abend","zzend"],"rejects":["aend","abxend","abendx",""]}
+{"regex":"([a-z]|[A-Z])*z","accepts":["z","az","AAz","aBz"],"rejects":["","za","zz1","aB"]}
+{"regex":"(a+)*zz","accepts":["zz","azz","aazz","aaazz"],"rejects":["","z","zza","bzz"]}
+{"regex":"(baa|a+)","accepts":["baa","a","aa","aaa"],"rejects":["","ba","b","baaa"]}
+{"regex":"[b-]","accepts":["b","-"],"rejects":["","0","1","X"]}
+{"regex":"badutf","accepts":["badutf"],"rejects":["badut","adutf","0adutf","b0dutf"]}
+{"regex":"(?!bar)baz","accepts":["baz"],"rejects":["","bar","barbaz","abaz"]}
+{"regex":"[bcd]*a","accepts":["a","ba","cda","bbbba"],"rejects":["","b","ab","aac"]}
+{"regex":"(bc+d|ef*g|h?i(j|k))","accepts":["bcd","bccd","eg","effffg","ij","hik"],"rejects":["","bc","ef","hi","jx"]}
+{"regex":"(bc+d|ef*g|h?i(j|k))","accepts":["bcd","bccd","eg","efffg","ij","hik"],"rejects":["","bc","ef","hi"]}
+{"regex":"(bc+d|ef*g|h?i(j|k))","accepts":["bcd","bccd","eg","effg","ij","hik"],"rejects":["","bc","ef","hi","hk","effgz"]}
+{"regex":"c|abc","accepts":["c","abc"],"rejects":["","0","c0","0c"]}
+{"regex":"[c]abcd","accepts":["cabcd"],"rejects":["cabc","abcd","0abcd","c0bcd"]}
+{"regex":"(cat)|dog","accepts":["cat","dog"],"rejects":["","ca","do","catdog"]}
+{"regex":"cat|dog","accepts":["cat","dog"],"rejects":["caterpillar","snowcat","syndicate","ca"]}
+{"regex":"cat|dog|elephant","accepts":["cat","dog","elephant"],"rejects":["catdog","ele","mouse"]}
+{"regex":"[Cc]abcd","accepts":["Cabcd","cabcd"],"rejects":["","abcd","CCabcd","dabcd"]}
+{"regex":"[cc]abcd","accepts":["cabcd"],"rejects":["cabc","abcd","0abcd","c0bcd"]}
+{"regex":"cole","accepts":["cole"],"rejects":["col","ole","0ole","c0le"]}
+{"regex":"(d?|c?)[ab]xyz","accepts":["axyz","bxyz","daxyz","dbxyz"],"rejects":["axy","xyz","0xyz","a0yz"]}
+{"regex":"(d?|c)[ab]xyz","accepts":["axyz","daxyz","cbxyz","caxyz"],"rejects":["","a","b","c"]}
+{"regex":"dog|dogsbody","accepts":["dog","dogsbody"],"rejects":["do","og","0og","d0g"]}
+{"regex":"dog(sbody)?","accepts":["dog","dogsbody"],"rejects":["","a","b","c"]}
+{"regex":"dogsbody|dog","accepts":["dog","dogsbody"],"rejects":["","a","b","c"]}
+{"regex":"eff","accepts":["eff"],"rejects":["ef","ff","0ff","e0f"]}
+{"regex":"effg","accepts":["effg"],"rejects":["eff","ffg","0ffg","e0fg"]}
+{"regex":"efg","accepts":["efg"],"rejects":["ef","fg","0fg","e0g"]}
+{"regex":"f*","accepts":["f","","ff","fff"],"rejects":["foo","0","f0","0f"]}
+{"regex":"fo|bar","accepts":["fo","bar"],"rejects":["","a","b","c"]}
+{"regex":"(fo|foo)","accepts":["fo","foo"],"rejects":["f","fooo","ofo",""]}
+{"regex":"fo|foo","accepts":["fo","foo"],"rejects":["","f","fox","fooo"]}
+{"regex":"fo|foo","accepts":["fo","foo"],"rejects":["fox","f",""]}
+{"regex":"foo","accepts":["foo"],"rejects":["bar","fo","oo","0oo"]}
+{"regex":"(?!foo)[a-z]+","accepts":["bar","fo","fob","zoo"],"rejects":["","foo","foobar","Foo"]}
+{"regex":"(?!foo)bar","accepts":["bar"],"rejects":["","foo","foobar","abar"]}
+{"regex":"((foo)|(bar))*","accepts":["foobar","","foo","bar"],"rejects":["fooba","oobar","0oobar","f0obar"]}
+{"regex":"foobar","accepts":["foobar"],"rejects":["fooba","oobar","0oobar","f0obar"]}
+{"regex":"foo|bar","accepts":["foo","bar"],"rejects":["","foobar","fo","baz"]}
+{"regex":"foo|bar|[A-Z]","accepts":["foo","bar","A","Z"],"rejects":["FOO","baz","x",""]}
+{"regex":"(?=foo|bar)[a-z]+","accepts":["foo","bar","foobar","barfoo"],"rejects":["","baz","qux","Foo"]}
+{"regex":"foo|bar|[A-Z]","accepts":["foo","bar","X"],"rejects":["XY","baz","Fo"]}
+{"regex":"foo|bar|[A-Z]","accepts":["foo","bar","X"],"rejects":["","XY","FoO","baz"]}
+{"regex":"foo(?=bar)bar","accepts":["foobar"],"rejects":["","foo","bar","foobaz","foobarx"]}
+{"regex":"(?!foo)(bar|baz)","accepts":["bar","baz"],"rejects":["","foo","foobar","barbaz"]}
+{"regex":"(foo|bar)?baz","accepts":["baz","foobaz","barbaz"],"rejects":["","foo","bazfoo","foobarbaz"]}
+{"regex":"(?!foo|bar)baz","accepts":["baz"],"rejects":["","foo","bar","foobaz","barbaz"]}
+{"regex":"(?!(foo|bar))baz","accepts":["baz"],"rejects":["","foo","foobaz","barbaz"]}
+{"regex":"(foo|bar|baz)","accepts":["foo","bar","baz"],"rejects":["","ba","foobar","qux"]}
+{"regex":"(foo|bar)+baz","accepts":["foobaz","barbaz","foobarbaz","barfoobaz"],"rejects":["","baz","foo","foobar","foobazbar"]}
+{"regex":"(foo|bar)baz","accepts":["foobaz","barbaz"],"rejects":["foo","bar","baz","foobarbaz"]}
+{"regex":"foo(?!bar)baz","accepts":["foobaz"],"rejects":["","foo","foobar","foobarbaz","foobazx"]}
+{"regex":"(?!(foo|bar)baz)[a-z]+","accepts":["foo","bar","baz","quxbaz"],"rejects":["","foobaz","barbaz","foobazz"]}
+{"regex":"(?!(foo|bar)+baz)[a-z]+","accepts":["foo","bar","baz","qux"],"rejects":["foobaz","barbaz","foobarfoobaz",""]}
+{"regex":"(foo|bar)(?!baz)[a-z]+","accepts":["fooz","barqux","foobar"],"rejects":["foobaz","barbaz","foo","bazfoo"]}
+{"regex":"(foo|bar)(?=baz)baz","accepts":["foobaz","barbaz"],"rejects":["","foo","baz","foobarbaz"]}
+{"regex":"(?=(foo|bar)+baz)(foo|bar)+baz","accepts":["foobaz","barbaz","foobarfoobaz"],"rejects":["baz","foobar","foobarbazx",""]}
+{"regex":"(?=(foo|bar)baz)(foo|bar)baz","accepts":["foobaz","barbaz"],"rejects":["foo","barbazx","baz","quxbaz"]}
+{"regex":"(foo|bar)(?!baz)qux","accepts":["fooqux","barqux"],"rejects":["","foobaz","barbaz","fooquux"]}
+{"regex":"(?=foo|bar)(foo|bar)","accepts":["foo","bar"],"rejects":["","foobar","baz","fo"]}
+{"regex":"(foo|bar)+qux","accepts":["fooqux","barqux","foobarqux","barfooqux"],"rejects":["qux","foo","foobar","fooquxbar"]}
+{"regex":"(foo|bar)(?!qux)[a-z][a-z][a-z]","accepts":["foozzz","barabc"],"rejects":["","fooqux","barqux","foozz","barabcd"]}
+{"regex":"(foo|bar)(?=qux)qux","accepts":["fooqux","barqux"],"rejects":["","foo","qux","fooquux","foobarqux"]}
+{"regex":"(foo|fo)","accepts":["foo","fo"],"rejects":["f","fooo","ofo",""]}
+{"regex":"(?=foo)foo","accepts":["foo"],"rejects":["","fo","bar","foobar"]}
+{"regex":"(?=foo)foo","accepts":["foo"],"rejects":["","fo","foobar","afoo"]}
+{"regex":"(?=foo)foo","accepts":["foo"],"rejects":["","fo","fooo","afoo"]}
+{"regex":"(?!foo)foo|bar","accepts":["bar"],"rejects":["foo","foobar","baz","fo"]}
+{"regex":"foo|foobar","accepts":["foobar","foo"],"rejects":["","0","1","X"]}
+{"regex":"hello","accepts":["hello"],"rejects":["","a","b","c"]}
+{"regex":"(Hello)|wORLD","accepts":["Hello","wORLD"],"rejects":["Hell","ello","0ello","H0llo"]}
+{"regex":"[i]","accepts":["i"],"rejects":["I","","0","i0"]}
+{"regex":"i","accepts":["i"],"rejects":["I","","0","i0"]}
+{"regex":"I","accepts":["I"],"rejects":["i","","0","I0"]}
+{"regex":"[iI]","accepts":["i","I"],"rejects":["","0","i0","0i"]}
+{"regex":"iss","accepts":["iss"],"rejects":["Mississippi","is","ss","0ss"]}
+{"regex":"is+t","accepts":["ist","isst","issst"],"rejects":["","a","b","c"]}
+{"regex":"is?t","accepts":["ist","it"],"rejects":["","a","b","c"]}
+{"regex":"ist","accepts":["ist"],"rejects":["ikt","is","st","0st"]}
+{"regex":"[k]","accepts":["k"],"rejects":["","a","kk","K"]}
+{"regex":"(main(O)?)+","accepts":["main","mainO","mainmain"],"rejects":["","0","1","O"]}
+{"regex":"multiple[ ]words","accepts":["multiple words"],"rejects":["multiple","words","multiple words","multiple words, yeah"]}
+{"regex":"Python|Perl","accepts":["Python","Perl"],"rejects":["","python","PythonPerl","Tcl"]}
+{"regex":"Python|Perl","accepts":["Python","Perl"],"rejects":["","Pyth","Per","Tcl"]}
+{"regex":"(Python|Perl)","accepts":["Python","Perl"],"rejects":["Tcl","PythonPerl","python",""]}
+{"regex":"(Python|Perl|Tcl)","accepts":["Python","Perl","Tcl"],"rejects":["","python","PythonPerl","Ruby"]}
+{"regex":"(Python|Perl|Tcl)","accepts":["Python","Perl","Tcl"],"rejects":["","Ruby","PythonPerl","Per"]}
+{"regex":"Python|Perl|Tcl","accepts":["Python","Perl","Tcl"],"rejects":["Ruby","PythonPerl","perl",""]}
+{"regex":"[q-u]+","accepts":["q","s","u","qq"],"rejects":["","0","q0","0q"]}
+{"regex":"[Q-U]+","accepts":["Q","T","UQ"],"rejects":["","a","b","c"]}
+{"regex":"R+","accepts":["R","RR","RRR"],"rejects":["","0","R0","0R"]}
+{"regex":"[RST]+","accepts":["R","ST","TRS"],"rejects":["","Q","RU","r"]}
+{"regex":"[R-T]+","accepts":["R","ST","TRS"],"rejects":["","Q","RU","r"]}
+{"regex":"s","accepts":["s"],"rejects":["","0","s0","0s"]}
+{"regex":"s+","accepts":["s","ss","sss"],"rejects":["","0","s0","0s"]}
+{"regex":"samwise|sam|a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z","accepts":["samwise","A","B","C"],"rejects":["","0","1","00"]}
+{"regex":"shortutf","accepts":["shortutf"],"rejects":["shortut","hortutf","0hortutf","s0ortutf"]}
+{"regex":"[Ss]","accepts":["S","s"],"rejects":["","0","S0","0S"]}
+{"regex":"[Ss]+","accepts":["S","s","SS","Ss"],"rejects":["","0","S0","0S"]}
+{"regex":"t[a-g]n","accepts":["ten","tan","tdn","tgn"],"rejects":["te","en","0en","t0n"]}
+{"regex":"[ten]","accepts":["t","e","n"],"rejects":["ten","","0","t0"]}
+{"regex":"((((((((((((((((((((x))))))))))))))))))))","accepts":["x"],"rejects":["","0","1","X"]}
+{"regex":"X","accepts":["X"],"rejects":["","0","X0","0X"]}
+{"regex":"x","accepts":["x"],"rejects":["abxyz","","0","x0"]}
+{"regex":"(x?)?","accepts":["","x"],"rejects":["xx","a","ax","xa"]}
+{"regex":"x*","accepts":["","x","xx","xxx"],"rejects":["a","b","c","d"]}
+{"regex":"X*","accepts":["","X","XX","XXX"],"rejects":["x","A","XA","AX"]}
+{"regex":"X+","accepts":["X","XX","XXX"],"rejects":["","x","AX","XA"]}
+{"regex":"x+","accepts":["x","xx","xxx","xxxx"],"rejects":["","a","b","c"]}
+{"regex":"X(b)Y","accepts":["XbY"],"rejects":["","XY","XbbY","bXY"]}
+{"regex":"x?(x|b)","accepts":["b","x","xx","xb"],"rejects":["","a","c","d"]}
+{"regex":"xxx","accepts":["xxx"],"rejects":["xx","0xx","x0x","xx0"]}
+{"regex":"x+y","accepts":["xy","xxy","xxxy"],"rejects":["y","x","0y","x0"]}
+{"regex":"xyz","accepts":["xyz"],"rejects":["abcxyz","abc","abcxypqr","pqr"]}
+{"regex":"([xyz]*)x","accepts":["x","xx","yx","xyzx"],"rejects":["","xy","aax","za"]}
+{"regex":"(?!z)a","accepts":["a"],"rejects":["","z","za"]}
+{"regex":"(?!z)a","accepts":["a"],"rejects":["","z","za","aa"]}
+{"regex":"((Z)+|A)*","accepts":["","A","Z","AZ"],"rejects":["0","1","X","Y"]}
+{"regex":"((z)+|a)*","accepts":["","a","za","zzaa"],"rejects":["b","zab","azbz","zzabx"]}
+{"regex":"z*azb","accepts":["azb","zazb","zzzzazb"],"rejects":["ab","za","az"]}
+{"regex":"[zi]","accepts":["i","z"],"rejects":["I","","0","i0"]}
+{"regex":"(?=z)z","accepts":["z"],"rejects":["","a","zz"]}
+{"regex":"(?=z)z","accepts":["z"],"rejects":["","a","zz","az"]}
diff --git a/tests/regex-gen.sh b/tests/regex-gen.sh
new file mode 100755
index 0000000..8e2f0c8
--- /dev/null
+++ b/tests/regex-gen.sh
@@ -0,0 +1,41 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+cd "$(dirname "$0")"
+
+generate() {
+cat <<"EOF"
+//! Generated by `tests/regex-gen.sh` -- do not modify directly.
+
+mod common;
+use common::regex;
+
+EOF
+
+i=0
+while IFS= read -r line; do
+ i=$((i + 1))
+
+ pattern=$(jq -r '.regex' <<<"$line")
+
+ echo "#[test]"
+ echo "fn r${i}() {"
+
+ echo " let re = regex(r#\"${pattern}\"#);"
+
+ jq -r --arg pat "$pattern" '
+ .accepts[]
+ | " assert!(re.matches(r#\"\(.)\"#), \"pattern: \($pat) | expected accept: \(. )\");"
+ ' <<<"$line"
+
+ jq -r --arg pat "$pattern" '
+ .rejects[]
+ | " assert!(!re.matches(r#\"\(.)\"#), \"pattern: \($pat) | expected reject: \(. )\");"
+ ' <<<"$line"
+
+ echo "}"
+ echo
+done
+}
+
+generate < regex-data.json > regex.rs