diff options
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | src/parse/regex/mod.rs | 4 | ||||
| -rw-r--r-- | tests/common.rs | 15 | ||||
| -rw-r--r-- | tests/regex-data.json | 551 | ||||
| -rwxr-xr-x | tests/regex-gen.sh | 41 |
5 files changed, 609 insertions, 3 deletions
@@ -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 |
