summaryrefslogtreecommitdiffstats
path: root/vendor/regex-automata/data/tests
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/regex-automata/data/tests')
-rw-r--r--vendor/regex-automata/data/tests/crazy.toml177
-rw-r--r--vendor/regex-automata/data/tests/flags.toml59
-rw-r--r--vendor/regex-automata/data/tests/fowler/LICENSE19
-rw-r--r--vendor/regex-automata/data/tests/fowler/README23
-rw-r--r--vendor/regex-automata/data/tests/fowler/basic.dat221
-rw-r--r--vendor/regex-automata/data/tests/fowler/basic.toml1428
-rwxr-xr-xvendor/regex-automata/data/tests/fowler/fowler-to-toml76
-rw-r--r--vendor/regex-automata/data/tests/fowler/nullsubexpr.dat79
-rw-r--r--vendor/regex-automata/data/tests/fowler/nullsubexpr.toml350
-rw-r--r--vendor/regex-automata/data/tests/fowler/repetition-long.dat85
-rw-r--r--vendor/regex-automata/data/tests/fowler/repetition-long.toml294
-rw-r--r--vendor/regex-automata/data/tests/fowler/repetition.dat83
-rw-r--r--vendor/regex-automata/data/tests/fowler/repetition.toml343
-rw-r--r--vendor/regex-automata/data/tests/iter.toml92
-rw-r--r--vendor/regex-automata/data/tests/no-unicode.toml138
-rw-r--r--vendor/regex-automata/data/tests/unicode.toml489
16 files changed, 3956 insertions, 0 deletions
diff --git a/vendor/regex-automata/data/tests/crazy.toml b/vendor/regex-automata/data/tests/crazy.toml
new file mode 100644
index 000000000..30c4b314d
--- /dev/null
+++ b/vendor/regex-automata/data/tests/crazy.toml
@@ -0,0 +1,177 @@
+[[tests]]
+name = "crazy-misc1"
+pattern = '[-+]?[0-9]*\.?[0-9]+'
+input = "0.1"
+matches = [[0, 3]]
+
+[[tests]]
+name = "crazy-misc2"
+pattern = '[-+]?[0-9]*\.?[0-9]+'
+input = "0.1.2"
+matches = [[0, 3]]
+
+[[tests]]
+name = "crazy-misc3"
+pattern = '[-+]?[0-9]*\.?[0-9]+'
+input = "a1.2"
+matches = [[1, 4]]
+
+[[tests]]
+options = ["case-insensitive"]
+name = "crazy-misc4"
+pattern = '[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}'
+input = "mine is jam.slam@gmail.com "
+matches = [[8, 26]]
+
+[[tests]]
+options = ["case-insensitive"]
+name = "crazy-misc5"
+pattern = '[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}'
+input = "mine is jam.slam@gmail "
+matches = []
+
+[[tests]]
+name = "crazy-misc6"
+pattern = '''[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?'''
+input = "mine is jam.slam@gmail.com "
+matches = [[8, 26]]
+
+[[tests]]
+name = "crazy-misc7"
+pattern = '(19|20)\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])'
+input = "1900-01-01"
+matches = [[0, 10]]
+
+[[tests]]
+name = "crazy-misc8"
+pattern = '(19|20)\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])'
+input = "1900-00-01"
+matches = []
+
+[[tests]]
+name = "crazy-misc9"
+pattern = '(19|20)\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])'
+input = "1900-13-01"
+matches = []
+
+
+[[tests]]
+name = "crazy-negclass1"
+pattern = "[^ac]"
+input = "acx"
+matches = [[2, 3]]
+
+[[tests]]
+name = "crazy-negclass2"
+pattern = "[^a,]"
+input = "a,x"
+matches = [[2, 3]]
+
+[[tests]]
+name = "crazy-negclass3"
+pattern = '[^a\s]'
+input = "a x"
+matches = [[2, 3]]
+
+[[tests]]
+name = "crazy-negclass4"
+pattern = "[^,]"
+input = ",,x"
+matches = [[2, 3]]
+
+[[tests]]
+name = "crazy-negclass5"
+pattern = '[^\s]'
+input = " a"
+matches = [[1, 2]]
+
+[[tests]]
+name = "crazy-negclass6"
+pattern = '[^,\s]'
+input = ", a"
+matches = [[2, 3]]
+
+[[tests]]
+name = "crazy-negclass7"
+pattern = '[^\s,]'
+input = " ,a"
+matches = [[2, 3]]
+
+[[tests]]
+name = "crazy-negclass8"
+pattern = "[^[:alpha:]Z]"
+input = "A1"
+matches = [[1, 2]]
+
+
+[[tests]]
+name = "crazy-empty-repeat1"
+pattern = "((.*)*?)="
+input = "a=b"
+matches = [[0, 2]]
+
+[[tests]]
+name = "crazy-empty-repeat2"
+pattern = "((.?)*?)="
+input = "a=b"
+matches = [[0, 2]]
+
+[[tests]]
+name = "crazy-empty-repeat3"
+pattern = "((.*)+?)="
+input = "a=b"
+matches = [[0, 2]]
+
+[[tests]]
+name = "crazy-empty-repeat4"
+pattern = "((.?)+?)="
+input = "a=b"
+matches = [[0, 2]]
+
+[[tests]]
+name = "crazy-empty-repeat5"
+pattern = "((.*){1,}?)="
+input = "a=b"
+matches = [[0, 2]]
+
+[[tests]]
+name = "crazy-empty-repeat6"
+pattern = "((.*){1,2}?)="
+input = "a=b"
+matches = [[0, 2]]
+
+[[tests]]
+name = "crazy-empty-repeat7"
+pattern = "((.*)*)="
+input = "a=b"
+matches = [[0, 2]]
+
+[[tests]]
+name = "crazy-empty-repeat8"
+pattern = "((.?)*)="
+input = "a=b"
+matches = [[0, 2]]
+
+[[tests]]
+name = "crazy-empty-repeat9"
+pattern = "((.*)+)="
+input = "a=b"
+matches = [[0, 2]]
+
+[[tests]]
+name = "crazy-empty-repeat10"
+pattern = "((.?)+)="
+input = "a=b"
+matches = [[0, 2]]
+
+[[tests]]
+name = "crazy-empty-repeat11"
+pattern = "((.*){1,})="
+input = "a=b"
+matches = [[0, 2]]
+
+[[tests]]
+name = "crazy-empty-repeat12"
+pattern = "((.*){1,2})="
+input = "a=b"
+matches = [[0, 2]]
diff --git a/vendor/regex-automata/data/tests/flags.toml b/vendor/regex-automata/data/tests/flags.toml
new file mode 100644
index 000000000..98024d9f7
--- /dev/null
+++ b/vendor/regex-automata/data/tests/flags.toml
@@ -0,0 +1,59 @@
+[[tests]]
+name = "flags1"
+pattern = "(?i)abc"
+input = "ABC"
+matches = [[0, 3]]
+
+[[tests]]
+name = "flags2"
+pattern = "(?i)a(?-i)bc"
+input = "Abc"
+matches = [[0, 3]]
+
+[[tests]]
+name = "flags3"
+pattern = "(?i)a(?-i)bc"
+input = "ABC"
+matches = []
+
+[[tests]]
+name = "flags4"
+pattern = "(?is)a."
+input = "A\n"
+matches = [[0, 2]]
+
+[[tests]]
+name = "flags5"
+pattern = "(?is)a.(?-is)a."
+input = "A\nab"
+matches = [[0, 4]]
+
+[[tests]]
+name = "flags6"
+pattern = "(?is)a.(?-is)a."
+input = "A\na\n"
+matches = []
+
+[[tests]]
+name = "flags7"
+pattern = "(?is)a.(?-is:a.)?"
+input = "A\na\n"
+matches = [[0, 2]]
+
+[[tests]]
+name = "flags8"
+pattern = "(?U)a+"
+input = "aa"
+matches = [[0, 1]]
+
+[[tests]]
+name = "flags9"
+pattern = "(?U)a+?"
+input = "aa"
+matches = [[0, 2]]
+
+[[tests]]
+name = "flags10"
+pattern = "(?U)(?-U)a+"
+input = "aa"
+matches = [[0, 2]]
diff --git a/vendor/regex-automata/data/tests/fowler/LICENSE b/vendor/regex-automata/data/tests/fowler/LICENSE
new file mode 100644
index 000000000..f47dbf4c4
--- /dev/null
+++ b/vendor/regex-automata/data/tests/fowler/LICENSE
@@ -0,0 +1,19 @@
+The following license covers testregex.c and all associated test data.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of THIS SOFTWARE FILE (the "Software"), to deal in the Software
+without restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, and/or sell copies of the
+Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following disclaimer:
+
+THIS SOFTWARE IS PROVIDED BY AT&T ``AS IS'' AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL AT&T BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/regex-automata/data/tests/fowler/README b/vendor/regex-automata/data/tests/fowler/README
new file mode 100644
index 000000000..55507f03f
--- /dev/null
+++ b/vendor/regex-automata/data/tests/fowler/README
@@ -0,0 +1,23 @@
+Test data was taken from the Go distribution, which was in turn taken from the
+testregex test suite:
+
+ http://www2.research.att.com/~astopen/testregex/testregex.html
+
+Unfortunately, the above link is now dead, but the test data lives on.
+
+The LICENSE in this directory corresponds to the LICENSE that the data was
+originally released under.
+
+The tests themselves were modified for RE2/Go. A couple were modified further
+by me (Andrew Gallant) (only in repetition.dat) so that RE2/Go would pass them.
+(Yes, it seems like RE2/Go includes failing test cases.) This may or may not
+have been a bad idea, but I think being consistent with an established Regex
+library is worth something.
+
+After some number of years, these tests were transformed into a JSON format
+using the fowler-to-json script in this directory, e.g.,
+
+ ./fowler-to-json basic.dat > basic.json
+
+which brings them into a sensible structured format in which other tests can
+be written.
diff --git a/vendor/regex-automata/data/tests/fowler/basic.dat b/vendor/regex-automata/data/tests/fowler/basic.dat
new file mode 100644
index 000000000..e55efaeec
--- /dev/null
+++ b/vendor/regex-automata/data/tests/fowler/basic.dat
@@ -0,0 +1,221 @@
+NOTE all standard compliant implementations should pass these : 2002-05-31
+
+BE abracadabra$ abracadabracadabra (7,18)
+BE a...b abababbb (2,7)
+BE XXXXXX ..XXXXXX (2,8)
+E \) () (1,2)
+BE a] a]a (0,2)
+B } } (0,1)
+E \} } (0,1)
+BE \] ] (0,1)
+B ] ] (0,1)
+E ] ] (0,1)
+B { { (0,1)
+B } } (0,1)
+BE ^a ax (0,1)
+BE \^a a^a (1,3)
+BE a\^ a^ (0,2)
+BE a$ aa (1,2)
+BE a\$ a$ (0,2)
+BE ^$ NULL (0,0)
+E $^ NULL (0,0)
+E a($) aa (1,2)(2,2)
+E a*(^a) aa (0,1)(0,1)
+E (..)*(...)* a (0,0)
+E (..)*(...)* abcd (0,4)(2,4)
+E (ab|a)(bc|c) abc (0,3)(0,2)(2,3)
+E (ab)c|abc abc (0,3)(0,2)
+E a{0}b ab (1,2)
+E (a*)(b?)(b+)b{3} aaabbbbbbb (0,10)(0,3)(3,4)(4,7)
+E (a*)(b{0,1})(b{1,})b{3} aaabbbbbbb (0,10)(0,3)(3,4)(4,7)
+E a{9876543210} NULL BADBR
+E ((a|a)|a) a (0,1)(0,1)(0,1)
+E (a*)(a|aa) aaaa (0,4)(0,3)(3,4)
+E a*(a.|aa) aaaa (0,4)(2,4)
+E a(b)|c(d)|a(e)f aef (0,3)(?,?)(?,?)(1,2)
+E (a|b)?.* b (0,1)(0,1)
+E (a|b)c|a(b|c) ac (0,2)(0,1)
+E (a|b)c|a(b|c) ab (0,2)(?,?)(1,2)
+E (a|b)*c|(a|ab)*c abc (0,3)(1,2)
+E (a|b)*c|(a|ab)*c xc (1,2)
+E (.a|.b).*|.*(.a|.b) xa (0,2)(0,2)
+E a?(ab|ba)ab abab (0,4)(0,2)
+E a?(ac{0}b|ba)ab abab (0,4)(0,2)
+E ab|abab abbabab (0,2)
+E aba|bab|bba baaabbbaba (5,8)
+E aba|bab baaabbbaba (6,9)
+E (aa|aaa)*|(a|aaaaa) aa (0,2)(0,2)
+E (a.|.a.)*|(a|.a...) aa (0,2)(0,2)
+E ab|a xabc (1,3)
+E ab|a xxabc (2,4)
+Ei (Ab|cD)* aBcD (0,4)(2,4)
+BE [^-] --a (2,3)
+BE [a-]* --a (0,3)
+BE [a-m-]* --amoma-- (0,4)
+E :::1:::0:|:::1:1:0: :::0:::1:::1:::0: (8,17)
+E :::1:::0:|:::1:1:1: :::0:::1:::1:::0: (8,17)
+{E [[:upper:]] A (0,1) [[<element>]] not supported
+E [[:lower:]]+ `az{ (1,3)
+E [[:upper:]]+ @AZ[ (1,3)
+# No collation in Go
+#BE [[-]] [[-]] (2,4)
+#BE [[.NIL.]] NULL ECOLLATE
+#BE [[=aleph=]] NULL ECOLLATE
+}
+BE$ \n \n (0,1)
+BEn$ \n \n (0,1)
+BE$ [^a] \n (0,1)
+BE$ \na \na (0,2)
+E (a)(b)(c) abc (0,3)(0,1)(1,2)(2,3)
+BE xxx xxx (0,3)
+E1 (^|[ (,;])((([Ff]eb[^ ]* *|0*2/|\* */?)0*[6-7]))([^0-9]|$) feb 6, (0,6)
+E1 (^|[ (,;])((([Ff]eb[^ ]* *|0*2/|\* */?)0*[6-7]))([^0-9]|$) 2/7 (0,3)
+E1 (^|[ (,;])((([Ff]eb[^ ]* *|0*2/|\* */?)0*[6-7]))([^0-9]|$) feb 1,Feb 6 (5,11)
+E3 ((((((((((((((((((((((((((((((x)))))))))))))))))))))))))))))) x (0,1)(0,1)(0,1)
+E3 ((((((((((((((((((((((((((((((x))))))))))))))))))))))))))))))* xx (0,2)(1,2)(1,2)
+E a?(ab|ba)* ababababababababababababababababababababababababababababababababababababababababa (0,81)(79,81)
+E abaa|abbaa|abbbaa|abbbbaa ababbabbbabbbabbbbabbbbaa (18,25)
+E abaa|abbaa|abbbaa|abbbbaa ababbabbbabbbabbbbabaa (18,22)
+E aaac|aabc|abac|abbc|baac|babc|bbac|bbbc baaabbbabac (7,11)
+BE$ .* \x01\x7f (0,2)
+E aaaa|bbbb|cccc|ddddd|eeeeee|fffffff|gggg|hhhh|iiiii|jjjjj|kkkkk|llll XaaaXbbbXcccXdddXeeeXfffXgggXhhhXiiiXjjjXkkkXlllXcbaXaaaa (53,57)
+L aaaa\nbbbb\ncccc\nddddd\neeeeee\nfffffff\ngggg\nhhhh\niiiii\njjjjj\nkkkkk\nllll XaaaXbbbXcccXdddXeeeXfffXgggXhhhXiiiXjjjXkkkXlllXcbaXaaaa NOMATCH
+E a*a*a*a*a*b aaaaaaaaab (0,10)
+BE ^ NULL (0,0)
+BE $ NULL (0,0)
+BE ^$ NULL (0,0)
+BE ^a$ a (0,1)
+BE abc abc (0,3)
+BE abc xabcy (1,4)
+BE abc ababc (2,5)
+BE ab*c abc (0,3)
+BE ab*bc abc (0,3)
+BE ab*bc abbc (0,4)
+BE ab*bc abbbbc (0,6)
+E ab+bc abbc (0,4)
+E ab+bc abbbbc (0,6)
+E ab?bc abbc (0,4)
+E ab?bc abc (0,3)
+E ab?c abc (0,3)
+BE ^abc$ abc (0,3)
+BE ^abc abcc (0,3)
+BE abc$ aabc (1,4)
+BE ^ abc (0,0)
+BE $ abc (3,3)
+BE a.c abc (0,3)
+BE a.c axc (0,3)
+BE a.*c axyzc (0,5)
+BE a[bc]d abd (0,3)
+BE a[b-d]e ace (0,3)
+BE a[b-d] aac (1,3)
+BE a[-b] a- (0,2)
+BE a[b-] a- (0,2)
+BE a] a] (0,2)
+BE a[]]b a]b (0,3)
+BE a[^bc]d aed (0,3)
+BE a[^-b]c adc (0,3)
+BE a[^]b]c adc (0,3)
+E ab|cd abc (0,2)
+E ab|cd abcd (0,2)
+E a\(b a(b (0,3)
+E a\(*b ab (0,2)
+E a\(*b a((b (0,4)
+E ((a)) abc (0,1)(0,1)(0,1)
+E (a)b(c) abc (0,3)(0,1)(2,3)
+E a+b+c aabbabc (4,7)
+E a* aaa (0,3)
+#E (a*)* - (0,0)(0,0)
+E (a*)* - (0,0)(?,?) RE2/Go
+E (a*)+ - (0,0)(0,0)
+#E (a*|b)* - (0,0)(0,0)
+E (a*|b)* - (0,0)(?,?) RE2/Go
+E (a+|b)* ab (0,2)(1,2)
+E (a+|b)+ ab (0,2)(1,2)
+E (a+|b)? ab (0,1)(0,1)
+BE [^ab]* cde (0,3)
+#E (^)* - (0,0)(0,0)
+E (^)* - (0,0)(?,?) RE2/Go
+BE a* NULL (0,0)
+E ([abc])*d abbbcd (0,6)(4,5)
+E ([abc])*bcd abcd (0,4)(0,1)
+E a|b|c|d|e e (0,1)
+E (a|b|c|d|e)f ef (0,2)(0,1)
+#E ((a*|b))* - (0,0)(0,0)(0,0)
+E ((a*|b))* - (0,0)(?,?)(?,?) RE2/Go
+BE abcd*efg abcdefg (0,7)
+BE ab* xabyabbbz (1,3)
+BE ab* xayabbbz (1,2)
+E (ab|cd)e abcde (2,5)(2,4)
+BE [abhgefdc]ij hij (0,3)
+E (a|b)c*d abcd (1,4)(1,2)
+E (ab|ab*)bc abc (0,3)(0,1)
+E a([bc]*)c* abc (0,3)(1,3)
+E a([bc]*)(c*d) abcd (0,4)(1,3)(3,4)
+E a([bc]+)(c*d) abcd (0,4)(1,3)(3,4)
+E a([bc]*)(c+d) abcd (0,4)(1,2)(2,4)
+E a[bcd]*dcdcde adcdcde (0,7)
+E (ab|a)b*c abc (0,3)(0,2)
+E ((a)(b)c)(d) abcd (0,4)(0,3)(0,1)(1,2)(3,4)
+BE [A-Za-z_][A-Za-z0-9_]* alpha (0,5)
+E ^a(bc+|b[eh])g|.h$ abh (1,3)
+E (bc+d$|ef*g.|h?i(j|k)) effgz (0,5)(0,5)
+E (bc+d$|ef*g.|h?i(j|k)) ij (0,2)(0,2)(1,2)
+E (bc+d$|ef*g.|h?i(j|k)) reffgz (1,6)(1,6)
+E (((((((((a))))))))) a (0,1)(0,1)(0,1)(0,1)(0,1)(0,1)(0,1)(0,1)(0,1)(0,1)
+BE multiple words multiple words yeah (0,14)
+E (.*)c(.*) abcde (0,5)(0,2)(3,5)
+BE abcd abcd (0,4)
+E a(bc)d abcd (0,4)(1,3)
+E a[-]?c ac (0,3)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Muammar Qaddafi (0,15)(?,?)(10,12)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Mo'ammar Gadhafi (0,16)(?,?)(11,13)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Muammar Kaddafi (0,15)(?,?)(10,12)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Muammar Qadhafi (0,15)(?,?)(10,12)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Muammar Gadafi (0,14)(?,?)(10,11)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Mu'ammar Qadafi (0,15)(?,?)(11,12)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Moamar Gaddafi (0,14)(?,?)(9,11)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Mu'ammar Qadhdhafi (0,18)(?,?)(13,15)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Muammar Khaddafi (0,16)(?,?)(11,13)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Muammar Ghaddafy (0,16)(?,?)(11,13)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Muammar Ghadafi (0,15)(?,?)(11,12)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Muammar Ghaddafi (0,16)(?,?)(11,13)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Muamar Kaddafi (0,14)(?,?)(9,11)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Muammar Quathafi (0,16)(?,?)(11,13)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Muammar Gheddafi (0,16)(?,?)(11,13)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Moammar Khadafy (0,15)(?,?)(11,12)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Moammar Qudhafi (0,15)(?,?)(10,12)
+E a+(b|c)*d+ aabcdd (0,6)(3,4)
+E ^.+$ vivi (0,4)
+E ^(.+)$ vivi (0,4)(0,4)
+E ^([^!.]+).att.com!(.+)$ gryphon.att.com!eby (0,19)(0,7)(16,19)
+E ^([^!]+!)?([^!]+)$ bas (0,3)(?,?)(0,3)
+E ^([^!]+!)?([^!]+)$ bar!bas (0,7)(0,4)(4,7)
+E ^([^!]+!)?([^!]+)$ foo!bas (0,7)(0,4)(4,7)
+E ^.+!([^!]+!)([^!]+)$ foo!bar!bas (0,11)(4,8)(8,11)
+E ((foo)|(bar))!bas bar!bas (0,7)(0,3)(?,?)(0,3)
+E ((foo)|(bar))!bas foo!bar!bas (4,11)(4,7)(?,?)(4,7)
+E ((foo)|(bar))!bas foo!bas (0,7)(0,3)(0,3)
+E ((foo)|bar)!bas bar!bas (0,7)(0,3)
+E ((foo)|bar)!bas foo!bar!bas (4,11)(4,7)
+E ((foo)|bar)!bas foo!bas (0,7)(0,3)(0,3)
+E (foo|(bar))!bas bar!bas (0,7)(0,3)(0,3)
+E (foo|(bar))!bas foo!bar!bas (4,11)(4,7)(4,7)
+E (foo|(bar))!bas foo!bas (0,7)(0,3)
+E (foo|bar)!bas bar!bas (0,7)(0,3)
+E (foo|bar)!bas foo!bar!bas (4,11)(4,7)
+E (foo|bar)!bas foo!bas (0,7)(0,3)
+E ^(([^!]+!)?([^!]+)|.+!([^!]+!)([^!]+))$ foo!bar!bas (0,11)(0,11)(?,?)(?,?)(4,8)(8,11)
+E ^([^!]+!)?([^!]+)$|^.+!([^!]+!)([^!]+)$ bas (0,3)(?,?)(0,3)
+E ^([^!]+!)?([^!]+)$|^.+!([^!]+!)([^!]+)$ bar!bas (0,7)(0,4)(4,7)
+E ^([^!]+!)?([^!]+)$|^.+!([^!]+!)([^!]+)$ foo!bar!bas (0,11)(?,?)(?,?)(4,8)(8,11)
+E ^([^!]+!)?([^!]+)$|^.+!([^!]+!)([^!]+)$ foo!bas (0,7)(0,4)(4,7)
+E ^(([^!]+!)?([^!]+)|.+!([^!]+!)([^!]+))$ bas (0,3)(0,3)(?,?)(0,3)
+E ^(([^!]+!)?([^!]+)|.+!([^!]+!)([^!]+))$ bar!bas (0,7)(0,7)(0,4)(4,7)
+E ^(([^!]+!)?([^!]+)|.+!([^!]+!)([^!]+))$ foo!bar!bas (0,11)(0,11)(?,?)(?,?)(4,8)(8,11)
+E ^(([^!]+!)?([^!]+)|.+!([^!]+!)([^!]+))$ foo!bas (0,7)(0,7)(0,4)(4,7)
+E .*(/XXX).* /XXX (0,4)(0,4)
+E .*(\\XXX).* \XXX (0,4)(0,4)
+E \\XXX \XXX (0,4)
+E .*(/000).* /000 (0,4)(0,4)
+E .*(\\000).* \000 (0,4)(0,4)
+E \\000 \000 (0,4)
diff --git a/vendor/regex-automata/data/tests/fowler/basic.toml b/vendor/regex-automata/data/tests/fowler/basic.toml
new file mode 100644
index 000000000..3eeebd799
--- /dev/null
+++ b/vendor/regex-automata/data/tests/fowler/basic.toml
@@ -0,0 +1,1428 @@
+[[tests]]
+name = "basic3"
+options = ['escaped']
+pattern = '''abracadabra$'''
+input = '''abracadabracadabra'''
+matches = [[7, 18]]
+
+[[tests]]
+name = "basic4"
+options = ['escaped']
+pattern = '''a...b'''
+input = '''abababbb'''
+matches = [[2, 7]]
+
+[[tests]]
+name = "basic5"
+options = ['escaped']
+pattern = '''XXXXXX'''
+input = '''..XXXXXX'''
+matches = [[2, 8]]
+
+[[tests]]
+name = "basic6"
+options = ['escaped']
+pattern = '''\)'''
+input = '''()'''
+matches = [[1, 2]]
+
+[[tests]]
+name = "basic7"
+options = ['escaped']
+pattern = '''a]'''
+input = '''a]a'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "basic9"
+options = ['escaped']
+pattern = '''\}'''
+input = '''}'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "basic10"
+options = ['escaped']
+pattern = '''\]'''
+input = ''']'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "basic12"
+options = ['escaped']
+pattern = ''']'''
+input = ''']'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "basic15"
+options = ['escaped']
+pattern = '''^a'''
+input = '''ax'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "basic16"
+options = ['escaped']
+pattern = '''\^a'''
+input = '''a^a'''
+matches = [[1, 3]]
+
+[[tests]]
+name = "basic17"
+options = ['escaped']
+pattern = '''a\^'''
+input = '''a^'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "basic18"
+options = ['escaped']
+pattern = '''a$'''
+input = '''aa'''
+matches = [[1, 2]]
+
+[[tests]]
+name = "basic19"
+options = ['escaped']
+pattern = '''a\$'''
+input = '''a$'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "basic20"
+options = ['escaped']
+pattern = '''^$'''
+input = ''''''
+matches = [[0, 0]]
+
+[[tests]]
+name = "basic21"
+options = ['escaped']
+pattern = '''$^'''
+input = ''''''
+matches = [[0, 0]]
+
+[[tests]]
+name = "basic22"
+options = ['escaped']
+pattern = '''a($)'''
+input = '''aa'''
+matches = [[1, 2]]
+
+[[tests]]
+name = "basic23"
+options = ['escaped']
+pattern = '''a*(^a)'''
+input = '''aa'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "basic24"
+options = ['escaped']
+pattern = '''(..)*(...)*'''
+input = '''a'''
+matches = [[0, 0]]
+
+[[tests]]
+name = "basic25"
+options = ['escaped']
+pattern = '''(..)*(...)*'''
+input = '''abcd'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "basic26"
+options = ['escaped']
+pattern = '''(ab|a)(bc|c)'''
+input = '''abc'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic27"
+options = ['escaped']
+pattern = '''(ab)c|abc'''
+input = '''abc'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic28"
+options = ['escaped']
+pattern = '''a{0}b'''
+input = '''ab'''
+matches = [[1, 2]]
+
+[[tests]]
+name = "basic29"
+options = ['escaped']
+pattern = '''(a*)(b?)(b+)b{3}'''
+input = '''aaabbbbbbb'''
+matches = [[0, 10]]
+
+[[tests]]
+name = "basic30"
+options = ['escaped']
+pattern = '''(a*)(b{0,1})(b{1,})b{3}'''
+input = '''aaabbbbbbb'''
+matches = [[0, 10]]
+
+[[tests]]
+name = "basic32"
+options = ['escaped']
+pattern = '''((a|a)|a)'''
+input = '''a'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "basic33"
+options = ['escaped']
+pattern = '''(a*)(a|aa)'''
+input = '''aaaa'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "basic34"
+options = ['escaped']
+pattern = '''a*(a.|aa)'''
+input = '''aaaa'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "basic35"
+options = ['escaped']
+pattern = '''a(b)|c(d)|a(e)f'''
+input = '''aef'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic36"
+options = ['escaped']
+pattern = '''(a|b)?.*'''
+input = '''b'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "basic37"
+options = ['escaped']
+pattern = '''(a|b)c|a(b|c)'''
+input = '''ac'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "basic38"
+options = ['escaped']
+pattern = '''(a|b)c|a(b|c)'''
+input = '''ab'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "basic39"
+options = ['escaped']
+pattern = '''(a|b)*c|(a|ab)*c'''
+input = '''abc'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic40"
+options = ['escaped']
+pattern = '''(a|b)*c|(a|ab)*c'''
+input = '''xc'''
+matches = [[1, 2]]
+
+[[tests]]
+name = "basic41"
+options = ['escaped']
+pattern = '''(.a|.b).*|.*(.a|.b)'''
+input = '''xa'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "basic42"
+options = ['escaped']
+pattern = '''a?(ab|ba)ab'''
+input = '''abab'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "basic43"
+options = ['escaped']
+pattern = '''a?(ac{0}b|ba)ab'''
+input = '''abab'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "basic44"
+options = ['escaped']
+pattern = '''ab|abab'''
+input = '''abbabab'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "basic45"
+options = ['escaped']
+pattern = '''aba|bab|bba'''
+input = '''baaabbbaba'''
+matches = [[5, 8]]
+
+[[tests]]
+name = "basic46"
+options = ['escaped']
+pattern = '''aba|bab'''
+input = '''baaabbbaba'''
+matches = [[6, 9]]
+
+[[tests]]
+name = "basic47"
+options = ['escaped']
+pattern = '''(aa|aaa)*|(a|aaaaa)'''
+input = '''aa'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "basic48"
+options = ['escaped']
+pattern = '''(a.|.a.)*|(a|.a...)'''
+input = '''aa'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "basic49"
+options = ['escaped']
+pattern = '''ab|a'''
+input = '''xabc'''
+matches = [[1, 3]]
+
+[[tests]]
+name = "basic50"
+options = ['escaped']
+pattern = '''ab|a'''
+input = '''xxabc'''
+matches = [[2, 4]]
+
+[[tests]]
+name = "basic51"
+options = ['escaped', 'case-insensitive']
+pattern = '''(Ab|cD)*'''
+input = '''aBcD'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "basic52"
+options = ['escaped']
+pattern = '''[^-]'''
+input = '''--a'''
+matches = [[2, 3]]
+
+[[tests]]
+name = "basic53"
+options = ['escaped']
+pattern = '''[a-]*'''
+input = '''--a'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic54"
+options = ['escaped']
+pattern = '''[a-m-]*'''
+input = '''--amoma--'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "basic55"
+options = ['escaped']
+pattern = ''':::1:::0:|:::1:1:0:'''
+input = ''':::0:::1:::1:::0:'''
+matches = [[8, 17]]
+
+[[tests]]
+name = "basic56"
+options = ['escaped']
+pattern = ''':::1:::0:|:::1:1:1:'''
+input = ''':::0:::1:::1:::0:'''
+matches = [[8, 17]]
+
+[[tests]]
+name = "basic57"
+options = ['escaped']
+pattern = '''[[:upper:]]'''
+input = '''A'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "basic58"
+options = ['escaped']
+pattern = '''[[:lower:]]+'''
+input = '''`az{'''
+matches = [[1, 3]]
+
+[[tests]]
+name = "basic59"
+options = ['escaped']
+pattern = '''[[:upper:]]+'''
+input = '''@AZ['''
+matches = [[1, 3]]
+
+[[tests]]
+name = "basic65"
+options = ['escaped']
+pattern = '''\n'''
+input = '''\n'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "basic66"
+options = ['escaped']
+pattern = '''\n'''
+input = '''\n'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "basic67"
+options = ['escaped']
+pattern = '''[^a]'''
+input = '''\n'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "basic68"
+options = ['escaped']
+pattern = '''\na'''
+input = '''\na'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "basic69"
+options = ['escaped']
+pattern = '''(a)(b)(c)'''
+input = '''abc'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic70"
+options = ['escaped']
+pattern = '''xxx'''
+input = '''xxx'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic71"
+options = ['escaped']
+pattern = '''(^|[ (,;])((([Ff]eb[^ ]* *|0*2/|\* */?)0*[6-7]))([^0-9]|$)'''
+input = '''feb 6,'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "basic72"
+options = ['escaped']
+pattern = '''(^|[ (,;])((([Ff]eb[^ ]* *|0*2/|\* */?)0*[6-7]))([^0-9]|$)'''
+input = '''2/7'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic73"
+options = ['escaped']
+pattern = '''(^|[ (,;])((([Ff]eb[^ ]* *|0*2/|\* */?)0*[6-7]))([^0-9]|$)'''
+input = '''feb 1,Feb 6'''
+matches = [[5, 11]]
+
+[[tests]]
+name = "basic74"
+options = ['escaped']
+pattern = '''((((((((((((((((((((((((((((((x))))))))))))))))))))))))))))))'''
+input = '''x'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "basic75"
+options = ['escaped']
+pattern = '''((((((((((((((((((((((((((((((x))))))))))))))))))))))))))))))*'''
+input = '''xx'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "basic76"
+options = ['escaped']
+pattern = '''a?(ab|ba)*'''
+input = '''ababababababababababababababababababababababababababababababababababababababababa'''
+matches = [[0, 81]]
+
+[[tests]]
+name = "basic77"
+options = ['escaped']
+pattern = '''abaa|abbaa|abbbaa|abbbbaa'''
+input = '''ababbabbbabbbabbbbabbbbaa'''
+matches = [[18, 25]]
+
+[[tests]]
+name = "basic78"
+options = ['escaped']
+pattern = '''abaa|abbaa|abbbaa|abbbbaa'''
+input = '''ababbabbbabbbabbbbabaa'''
+matches = [[18, 22]]
+
+[[tests]]
+name = "basic79"
+options = ['escaped']
+pattern = '''aaac|aabc|abac|abbc|baac|babc|bbac|bbbc'''
+input = '''baaabbbabac'''
+matches = [[7, 11]]
+
+[[tests]]
+name = "basic80"
+options = ['escaped']
+pattern = '''.*'''
+input = '''\x01\x7f'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "basic81"
+options = ['escaped']
+pattern = '''aaaa|bbbb|cccc|ddddd|eeeeee|fffffff|gggg|hhhh|iiiii|jjjjj|kkkkk|llll'''
+input = '''XaaaXbbbXcccXdddXeeeXfffXgggXhhhXiiiXjjjXkkkXlllXcbaXaaaa'''
+matches = [[53, 57]]
+
+[[tests]]
+name = "basic83"
+options = ['escaped']
+pattern = '''a*a*a*a*a*b'''
+input = '''aaaaaaaaab'''
+matches = [[0, 10]]
+
+[[tests]]
+name = "basic84"
+options = ['escaped']
+pattern = '''^'''
+input = ''''''
+matches = [[0, 0]]
+
+[[tests]]
+name = "basic85"
+options = ['escaped']
+pattern = '''$'''
+input = ''''''
+matches = [[0, 0]]
+
+[[tests]]
+name = "basic86"
+options = ['escaped']
+pattern = '''^$'''
+input = ''''''
+matches = [[0, 0]]
+
+[[tests]]
+name = "basic87"
+options = ['escaped']
+pattern = '''^a$'''
+input = '''a'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "basic88"
+options = ['escaped']
+pattern = '''abc'''
+input = '''abc'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic89"
+options = ['escaped']
+pattern = '''abc'''
+input = '''xabcy'''
+matches = [[1, 4]]
+
+[[tests]]
+name = "basic90"
+options = ['escaped']
+pattern = '''abc'''
+input = '''ababc'''
+matches = [[2, 5]]
+
+[[tests]]
+name = "basic91"
+options = ['escaped']
+pattern = '''ab*c'''
+input = '''abc'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic92"
+options = ['escaped']
+pattern = '''ab*bc'''
+input = '''abc'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic93"
+options = ['escaped']
+pattern = '''ab*bc'''
+input = '''abbc'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "basic94"
+options = ['escaped']
+pattern = '''ab*bc'''
+input = '''abbbbc'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "basic95"
+options = ['escaped']
+pattern = '''ab+bc'''
+input = '''abbc'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "basic96"
+options = ['escaped']
+pattern = '''ab+bc'''
+input = '''abbbbc'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "basic97"
+options = ['escaped']
+pattern = '''ab?bc'''
+input = '''abbc'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "basic98"
+options = ['escaped']
+pattern = '''ab?bc'''
+input = '''abc'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic99"
+options = ['escaped']
+pattern = '''ab?c'''
+input = '''abc'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic100"
+options = ['escaped']
+pattern = '''^abc$'''
+input = '''abc'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic101"
+options = ['escaped']
+pattern = '''^abc'''
+input = '''abcc'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic102"
+options = ['escaped']
+pattern = '''abc$'''
+input = '''aabc'''
+matches = [[1, 4]]
+
+[[tests]]
+name = "basic103"
+options = ['escaped']
+pattern = '''^'''
+input = '''abc'''
+matches = [[0, 0]]
+
+[[tests]]
+name = "basic104"
+options = ['escaped']
+pattern = '''$'''
+input = '''abc'''
+matches = [[3, 3]]
+
+[[tests]]
+name = "basic105"
+options = ['escaped']
+pattern = '''a.c'''
+input = '''abc'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic106"
+options = ['escaped']
+pattern = '''a.c'''
+input = '''axc'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic107"
+options = ['escaped']
+pattern = '''a.*c'''
+input = '''axyzc'''
+matches = [[0, 5]]
+
+[[tests]]
+name = "basic108"
+options = ['escaped']
+pattern = '''a[bc]d'''
+input = '''abd'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic109"
+options = ['escaped']
+pattern = '''a[b-d]e'''
+input = '''ace'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic110"
+options = ['escaped']
+pattern = '''a[b-d]'''
+input = '''aac'''
+matches = [[1, 3]]
+
+[[tests]]
+name = "basic111"
+options = ['escaped']
+pattern = '''a[-b]'''
+input = '''a-'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "basic112"
+options = ['escaped']
+pattern = '''a[b-]'''
+input = '''a-'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "basic113"
+options = ['escaped']
+pattern = '''a]'''
+input = '''a]'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "basic114"
+options = ['escaped']
+pattern = '''a[]]b'''
+input = '''a]b'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic115"
+options = ['escaped']
+pattern = '''a[^bc]d'''
+input = '''aed'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic116"
+options = ['escaped']
+pattern = '''a[^-b]c'''
+input = '''adc'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic117"
+options = ['escaped']
+pattern = '''a[^]b]c'''
+input = '''adc'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic118"
+options = ['escaped']
+pattern = '''ab|cd'''
+input = '''abc'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "basic119"
+options = ['escaped']
+pattern = '''ab|cd'''
+input = '''abcd'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "basic120"
+options = ['escaped']
+pattern = '''a\(b'''
+input = '''a(b'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic121"
+options = ['escaped']
+pattern = '''a\(*b'''
+input = '''ab'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "basic122"
+options = ['escaped']
+pattern = '''a\(*b'''
+input = '''a((b'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "basic123"
+options = ['escaped']
+pattern = '''((a))'''
+input = '''abc'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "basic124"
+options = ['escaped']
+pattern = '''(a)b(c)'''
+input = '''abc'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic125"
+options = ['escaped']
+pattern = '''a+b+c'''
+input = '''aabbabc'''
+matches = [[4, 7]]
+
+[[tests]]
+name = "basic126"
+options = ['escaped']
+pattern = '''a*'''
+input = '''aaa'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic128"
+options = ['escaped']
+pattern = '''(a*)*'''
+input = '''-'''
+matches = [[0, 0]]
+
+[[tests]]
+name = "basic129"
+options = ['escaped']
+pattern = '''(a*)+'''
+input = '''-'''
+matches = [[0, 0]]
+
+[[tests]]
+name = "basic131"
+options = ['escaped']
+pattern = '''(a*|b)*'''
+input = '''-'''
+matches = [[0, 0]]
+
+[[tests]]
+name = "basic132"
+options = ['escaped']
+pattern = '''(a+|b)*'''
+input = '''ab'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "basic133"
+options = ['escaped']
+pattern = '''(a+|b)+'''
+input = '''ab'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "basic134"
+options = ['escaped']
+pattern = '''(a+|b)?'''
+input = '''ab'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "basic135"
+options = ['escaped']
+pattern = '''[^ab]*'''
+input = '''cde'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic137"
+options = ['escaped']
+pattern = '''(^)*'''
+input = '''-'''
+matches = [[0, 0]]
+
+[[tests]]
+name = "basic138"
+options = ['escaped']
+pattern = '''a*'''
+input = ''''''
+matches = [[0, 0]]
+
+[[tests]]
+name = "basic139"
+options = ['escaped']
+pattern = '''([abc])*d'''
+input = '''abbbcd'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "basic140"
+options = ['escaped']
+pattern = '''([abc])*bcd'''
+input = '''abcd'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "basic141"
+options = ['escaped']
+pattern = '''a|b|c|d|e'''
+input = '''e'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "basic142"
+options = ['escaped']
+pattern = '''(a|b|c|d|e)f'''
+input = '''ef'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "basic144"
+options = ['escaped']
+pattern = '''((a*|b))*'''
+input = '''-'''
+matches = [[0, 0]]
+
+[[tests]]
+name = "basic145"
+options = ['escaped']
+pattern = '''abcd*efg'''
+input = '''abcdefg'''
+matches = [[0, 7]]
+
+[[tests]]
+name = "basic146"
+options = ['escaped']
+pattern = '''ab*'''
+input = '''xabyabbbz'''
+matches = [[1, 3]]
+
+[[tests]]
+name = "basic147"
+options = ['escaped']
+pattern = '''ab*'''
+input = '''xayabbbz'''
+matches = [[1, 2]]
+
+[[tests]]
+name = "basic148"
+options = ['escaped']
+pattern = '''(ab|cd)e'''
+input = '''abcde'''
+matches = [[2, 5]]
+
+[[tests]]
+name = "basic149"
+options = ['escaped']
+pattern = '''[abhgefdc]ij'''
+input = '''hij'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic150"
+options = ['escaped']
+pattern = '''(a|b)c*d'''
+input = '''abcd'''
+matches = [[1, 4]]
+
+[[tests]]
+name = "basic151"
+options = ['escaped']
+pattern = '''(ab|ab*)bc'''
+input = '''abc'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic152"
+options = ['escaped']
+pattern = '''a([bc]*)c*'''
+input = '''abc'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic153"
+options = ['escaped']
+pattern = '''a([bc]*)(c*d)'''
+input = '''abcd'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "basic154"
+options = ['escaped']
+pattern = '''a([bc]+)(c*d)'''
+input = '''abcd'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "basic155"
+options = ['escaped']
+pattern = '''a([bc]*)(c+d)'''
+input = '''abcd'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "basic156"
+options = ['escaped']
+pattern = '''a[bcd]*dcdcde'''
+input = '''adcdcde'''
+matches = [[0, 7]]
+
+[[tests]]
+name = "basic157"
+options = ['escaped']
+pattern = '''(ab|a)b*c'''
+input = '''abc'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic158"
+options = ['escaped']
+pattern = '''((a)(b)c)(d)'''
+input = '''abcd'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "basic159"
+options = ['escaped']
+pattern = '''[A-Za-z_][A-Za-z0-9_]*'''
+input = '''alpha'''
+matches = [[0, 5]]
+
+[[tests]]
+name = "basic160"
+options = ['escaped']
+pattern = '''^a(bc+|b[eh])g|.h$'''
+input = '''abh'''
+matches = [[1, 3]]
+
+[[tests]]
+name = "basic161"
+options = ['escaped']
+pattern = '''(bc+d$|ef*g.|h?i(j|k))'''
+input = '''effgz'''
+matches = [[0, 5]]
+
+[[tests]]
+name = "basic162"
+options = ['escaped']
+pattern = '''(bc+d$|ef*g.|h?i(j|k))'''
+input = '''ij'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "basic163"
+options = ['escaped']
+pattern = '''(bc+d$|ef*g.|h?i(j|k))'''
+input = '''reffgz'''
+matches = [[1, 6]]
+
+[[tests]]
+name = "basic164"
+options = ['escaped']
+pattern = '''(((((((((a)))))))))'''
+input = '''a'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "basic165"
+options = ['escaped']
+pattern = '''multiple words'''
+input = '''multiple words yeah'''
+matches = [[0, 14]]
+
+[[tests]]
+name = "basic166"
+options = ['escaped']
+pattern = '''(.*)c(.*)'''
+input = '''abcde'''
+matches = [[0, 5]]
+
+[[tests]]
+name = "basic167"
+options = ['escaped']
+pattern = '''abcd'''
+input = '''abcd'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "basic168"
+options = ['escaped']
+pattern = '''a(bc)d'''
+input = '''abcd'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "basic169"
+options = ['escaped']
+pattern = '''a[\x01-\x03]?c'''
+input = '''a\x02c'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic170"
+options = ['escaped']
+pattern = '''M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]'''
+input = '''Muammar Qaddafi'''
+matches = [[0, 15]]
+
+[[tests]]
+name = "basic171"
+options = ['escaped']
+pattern = '''M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]'''
+input = '''Mo'ammar Gadhafi'''
+matches = [[0, 16]]
+
+[[tests]]
+name = "basic172"
+options = ['escaped']
+pattern = '''M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]'''
+input = '''Muammar Kaddafi'''
+matches = [[0, 15]]
+
+[[tests]]
+name = "basic173"
+options = ['escaped']
+pattern = '''M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]'''
+input = '''Muammar Qadhafi'''
+matches = [[0, 15]]
+
+[[tests]]
+name = "basic174"
+options = ['escaped']
+pattern = '''M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]'''
+input = '''Muammar Gadafi'''
+matches = [[0, 14]]
+
+[[tests]]
+name = "basic175"
+options = ['escaped']
+pattern = '''M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]'''
+input = '''Mu'ammar Qadafi'''
+matches = [[0, 15]]
+
+[[tests]]
+name = "basic176"
+options = ['escaped']
+pattern = '''M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]'''
+input = '''Moamar Gaddafi'''
+matches = [[0, 14]]
+
+[[tests]]
+name = "basic177"
+options = ['escaped']
+pattern = '''M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]'''
+input = '''Mu'ammar Qadhdhafi'''
+matches = [[0, 18]]
+
+[[tests]]
+name = "basic178"
+options = ['escaped']
+pattern = '''M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]'''
+input = '''Muammar Khaddafi'''
+matches = [[0, 16]]
+
+[[tests]]
+name = "basic179"
+options = ['escaped']
+pattern = '''M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]'''
+input = '''Muammar Ghaddafy'''
+matches = [[0, 16]]
+
+[[tests]]
+name = "basic180"
+options = ['escaped']
+pattern = '''M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]'''
+input = '''Muammar Ghadafi'''
+matches = [[0, 15]]
+
+[[tests]]
+name = "basic181"
+options = ['escaped']
+pattern = '''M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]'''
+input = '''Muammar Ghaddafi'''
+matches = [[0, 16]]
+
+[[tests]]
+name = "basic182"
+options = ['escaped']
+pattern = '''M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]'''
+input = '''Muamar Kaddafi'''
+matches = [[0, 14]]
+
+[[tests]]
+name = "basic183"
+options = ['escaped']
+pattern = '''M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]'''
+input = '''Muammar Quathafi'''
+matches = [[0, 16]]
+
+[[tests]]
+name = "basic184"
+options = ['escaped']
+pattern = '''M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]'''
+input = '''Muammar Gheddafi'''
+matches = [[0, 16]]
+
+[[tests]]
+name = "basic185"
+options = ['escaped']
+pattern = '''M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]'''
+input = '''Moammar Khadafy'''
+matches = [[0, 15]]
+
+[[tests]]
+name = "basic186"
+options = ['escaped']
+pattern = '''M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]'''
+input = '''Moammar Qudhafi'''
+matches = [[0, 15]]
+
+[[tests]]
+name = "basic187"
+options = ['escaped']
+pattern = '''a+(b|c)*d+'''
+input = '''aabcdd'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "basic188"
+options = ['escaped']
+pattern = '''^.+$'''
+input = '''vivi'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "basic189"
+options = ['escaped']
+pattern = '''^(.+)$'''
+input = '''vivi'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "basic190"
+options = ['escaped']
+pattern = '''^([^!.]+).att.com!(.+)$'''
+input = '''gryphon.att.com!eby'''
+matches = [[0, 19]]
+
+[[tests]]
+name = "basic191"
+options = ['escaped']
+pattern = '''^([^!]+!)?([^!]+)$'''
+input = '''bas'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic192"
+options = ['escaped']
+pattern = '''^([^!]+!)?([^!]+)$'''
+input = '''bar!bas'''
+matches = [[0, 7]]
+
+[[tests]]
+name = "basic193"
+options = ['escaped']
+pattern = '''^([^!]+!)?([^!]+)$'''
+input = '''foo!bas'''
+matches = [[0, 7]]
+
+[[tests]]
+name = "basic194"
+options = ['escaped']
+pattern = '''^.+!([^!]+!)([^!]+)$'''
+input = '''foo!bar!bas'''
+matches = [[0, 11]]
+
+[[tests]]
+name = "basic195"
+options = ['escaped']
+pattern = '''((foo)|(bar))!bas'''
+input = '''bar!bas'''
+matches = [[0, 7]]
+
+[[tests]]
+name = "basic196"
+options = ['escaped']
+pattern = '''((foo)|(bar))!bas'''
+input = '''foo!bar!bas'''
+matches = [[4, 11]]
+
+[[tests]]
+name = "basic197"
+options = ['escaped']
+pattern = '''((foo)|(bar))!bas'''
+input = '''foo!bas'''
+matches = [[0, 7]]
+
+[[tests]]
+name = "basic198"
+options = ['escaped']
+pattern = '''((foo)|bar)!bas'''
+input = '''bar!bas'''
+matches = [[0, 7]]
+
+[[tests]]
+name = "basic199"
+options = ['escaped']
+pattern = '''((foo)|bar)!bas'''
+input = '''foo!bar!bas'''
+matches = [[4, 11]]
+
+[[tests]]
+name = "basic200"
+options = ['escaped']
+pattern = '''((foo)|bar)!bas'''
+input = '''foo!bas'''
+matches = [[0, 7]]
+
+[[tests]]
+name = "basic201"
+options = ['escaped']
+pattern = '''(foo|(bar))!bas'''
+input = '''bar!bas'''
+matches = [[0, 7]]
+
+[[tests]]
+name = "basic202"
+options = ['escaped']
+pattern = '''(foo|(bar))!bas'''
+input = '''foo!bar!bas'''
+matches = [[4, 11]]
+
+[[tests]]
+name = "basic203"
+options = ['escaped']
+pattern = '''(foo|(bar))!bas'''
+input = '''foo!bas'''
+matches = [[0, 7]]
+
+[[tests]]
+name = "basic204"
+options = ['escaped']
+pattern = '''(foo|bar)!bas'''
+input = '''bar!bas'''
+matches = [[0, 7]]
+
+[[tests]]
+name = "basic205"
+options = ['escaped']
+pattern = '''(foo|bar)!bas'''
+input = '''foo!bar!bas'''
+matches = [[4, 11]]
+
+[[tests]]
+name = "basic206"
+options = ['escaped']
+pattern = '''(foo|bar)!bas'''
+input = '''foo!bas'''
+matches = [[0, 7]]
+
+[[tests]]
+name = "basic207"
+options = ['escaped']
+pattern = '''^(([^!]+!)?([^!]+)|.+!([^!]+!)([^!]+))$'''
+input = '''foo!bar!bas'''
+matches = [[0, 11]]
+
+[[tests]]
+name = "basic208"
+options = ['escaped']
+pattern = '''^([^!]+!)?([^!]+)$|^.+!([^!]+!)([^!]+)$'''
+input = '''bas'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic209"
+options = ['escaped']
+pattern = '''^([^!]+!)?([^!]+)$|^.+!([^!]+!)([^!]+)$'''
+input = '''bar!bas'''
+matches = [[0, 7]]
+
+[[tests]]
+name = "basic210"
+options = ['escaped']
+pattern = '''^([^!]+!)?([^!]+)$|^.+!([^!]+!)([^!]+)$'''
+input = '''foo!bar!bas'''
+matches = [[0, 11]]
+
+[[tests]]
+name = "basic211"
+options = ['escaped']
+pattern = '''^([^!]+!)?([^!]+)$|^.+!([^!]+!)([^!]+)$'''
+input = '''foo!bas'''
+matches = [[0, 7]]
+
+[[tests]]
+name = "basic212"
+options = ['escaped']
+pattern = '''^(([^!]+!)?([^!]+)|.+!([^!]+!)([^!]+))$'''
+input = '''bas'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "basic213"
+options = ['escaped']
+pattern = '''^(([^!]+!)?([^!]+)|.+!([^!]+!)([^!]+))$'''
+input = '''bar!bas'''
+matches = [[0, 7]]
+
+[[tests]]
+name = "basic214"
+options = ['escaped']
+pattern = '''^(([^!]+!)?([^!]+)|.+!([^!]+!)([^!]+))$'''
+input = '''foo!bar!bas'''
+matches = [[0, 11]]
+
+[[tests]]
+name = "basic215"
+options = ['escaped']
+pattern = '''^(([^!]+!)?([^!]+)|.+!([^!]+!)([^!]+))$'''
+input = '''foo!bas'''
+matches = [[0, 7]]
+
+[[tests]]
+name = "basic216"
+options = ['escaped']
+pattern = '''.*(/XXX).*'''
+input = '''/XXX'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "basic217"
+options = ['escaped']
+pattern = '''.*(\\XXX).*'''
+input = '''\\XXX'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "basic218"
+options = ['escaped']
+pattern = '''\\XXX'''
+input = '''\\XXX'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "basic219"
+options = ['escaped']
+pattern = '''.*(/000).*'''
+input = '''/000'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "basic220"
+options = ['escaped']
+pattern = '''.*(\\000).*'''
+input = '''\\000'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "basic221"
+options = ['escaped']
+pattern = '''\\000'''
+input = '''\\000'''
+matches = [[0, 4]]
+
diff --git a/vendor/regex-automata/data/tests/fowler/fowler-to-toml b/vendor/regex-automata/data/tests/fowler/fowler-to-toml
new file mode 100755
index 000000000..5f1d91fcb
--- /dev/null
+++ b/vendor/regex-automata/data/tests/fowler/fowler-to-toml
@@ -0,0 +1,76 @@
+#!/usr/bin/env python
+
+from __future__ import absolute_import, division, print_function
+import argparse
+import os.path as path
+
+
+def read_tests(f):
+ basename, _ = path.splitext(path.basename(f))
+ tests = []
+ prev_pattern = None
+
+ for lineno, line in enumerate(open(f), 1):
+ fields = list(filter(None, map(str.strip, line.split('\t'))))
+ if not (4 <= len(fields) <= 5) \
+ or 'E' not in fields[0] or fields[0][0] == '#':
+ continue
+
+ terse_opts, pat, text, sgroups = fields[0:4]
+ groups = [] # groups as integer ranges
+ if sgroups == 'NOMATCH':
+ groups = []
+ elif ',' in sgroups:
+ noparen = map(lambda s: s.strip('()'), sgroups.split(')('))
+ for g in noparen:
+ s, e = map(str.strip, g.split(','))
+ groups.append([int(s), int(e)])
+ break
+ else:
+ # This skips tests that should result in an error.
+ # There aren't many, so I think we can just capture those
+ # manually. Possibly fix this in future.
+ continue
+
+ opts = []
+ if text == "NULL":
+ text = ""
+ if pat == 'SAME':
+ pat = prev_pattern
+ if '$' in terse_opts:
+ pat = pat.encode('utf-8').decode('unicode_escape')
+ text = text.encode('utf-8').decode('unicode_escape')
+ text = text.encode('unicode_escape').decode('utf-8')
+ opts.append('escaped')
+ else:
+ opts.append('escaped')
+ text = text.encode('unicode_escape').decode('utf-8')
+ if 'i' in terse_opts:
+ opts.append('case-insensitive')
+
+ pat = pat.encode('unicode_escape').decode('utf-8')
+ pat = pat.replace('\\\\', '\\')
+ tests.append({
+ 'name': '"%s%d"' % (basename, lineno),
+ 'options': repr(opts),
+ 'pattern': "'''%s'''" % pat,
+ 'input': "'''%s'''" % text,
+ 'matches': str(groups),
+ })
+ prev_pattern = pat
+ return tests
+
+
+if __name__ == '__main__':
+ parser = argparse.ArgumentParser(
+ description='Generate match tests from an AT&T POSIX test file.')
+ aa = parser.add_argument
+ aa('datfile', help='A dat AT&T POSIX test file.')
+ args = parser.parse_args()
+
+ tests = read_tests(args.datfile)
+ for t in tests:
+ print('[[tests]]')
+ for k, v in t.items():
+ print('%s = %s' % (k, v))
+ print('')
diff --git a/vendor/regex-automata/data/tests/fowler/nullsubexpr.dat b/vendor/regex-automata/data/tests/fowler/nullsubexpr.dat
new file mode 100644
index 000000000..2e18fbb91
--- /dev/null
+++ b/vendor/regex-automata/data/tests/fowler/nullsubexpr.dat
@@ -0,0 +1,79 @@
+NOTE null subexpression matches : 2002-06-06
+
+E (a*)* a (0,1)(0,1)
+#E SAME x (0,0)(0,0)
+E SAME x (0,0)(?,?) RE2/Go
+E SAME aaaaaa (0,6)(0,6)
+E SAME aaaaaax (0,6)(0,6)
+E (a*)+ a (0,1)(0,1)
+E SAME x (0,0)(0,0)
+E SAME aaaaaa (0,6)(0,6)
+E SAME aaaaaax (0,6)(0,6)
+E (a+)* a (0,1)(0,1)
+E SAME x (0,0)
+E SAME aaaaaa (0,6)(0,6)
+E SAME aaaaaax (0,6)(0,6)
+E (a+)+ a (0,1)(0,1)
+E SAME x NOMATCH
+E SAME aaaaaa (0,6)(0,6)
+E SAME aaaaaax (0,6)(0,6)
+
+E ([a]*)* a (0,1)(0,1)
+#E SAME x (0,0)(0,0)
+E SAME x (0,0)(?,?) RE2/Go
+E SAME aaaaaa (0,6)(0,6)
+E SAME aaaaaax (0,6)(0,6)
+E ([a]*)+ a (0,1)(0,1)
+E SAME x (0,0)(0,0)
+E SAME aaaaaa (0,6)(0,6)
+E SAME aaaaaax (0,6)(0,6)
+E ([^b]*)* a (0,1)(0,1)
+#E SAME b (0,0)(0,0)
+E SAME b (0,0)(?,?) RE2/Go
+E SAME aaaaaa (0,6)(0,6)
+E SAME aaaaaab (0,6)(0,6)
+E ([ab]*)* a (0,1)(0,1)
+E SAME aaaaaa (0,6)(0,6)
+E SAME ababab (0,6)(0,6)
+E SAME bababa (0,6)(0,6)
+E SAME b (0,1)(0,1)
+E SAME bbbbbb (0,6)(0,6)
+E SAME aaaabcde (0,5)(0,5)
+E ([^a]*)* b (0,1)(0,1)
+E SAME bbbbbb (0,6)(0,6)
+#E SAME aaaaaa (0,0)(0,0)
+E SAME aaaaaa (0,0)(?,?) RE2/Go
+E ([^ab]*)* ccccxx (0,6)(0,6)
+#E SAME ababab (0,0)(0,0)
+E SAME ababab (0,0)(?,?) RE2/Go
+
+E ((z)+|a)* zabcde (0,2)(1,2)
+
+#{E a+? aaaaaa (0,1) no *? +? mimimal match ops
+#E (a) aaa (0,1)(0,1)
+#E (a*?) aaa (0,0)(0,0)
+#E (a)*? aaa (0,0)
+#E (a*?)*? aaa (0,0)
+#}
+
+B \(a*\)*\(x\) x (0,1)(0,0)(0,1)
+B \(a*\)*\(x\) ax (0,2)(0,1)(1,2)
+B \(a*\)*\(x\) axa (0,2)(0,1)(1,2)
+B \(a*\)*\(x\)\(\1\) x (0,1)(0,0)(0,1)(1,1)
+B \(a*\)*\(x\)\(\1\) ax (0,2)(1,1)(1,2)(2,2)
+B \(a*\)*\(x\)\(\1\) axa (0,3)(0,1)(1,2)(2,3)
+B \(a*\)*\(x\)\(\1\)\(x\) axax (0,4)(0,1)(1,2)(2,3)(3,4)
+B \(a*\)*\(x\)\(\1\)\(x\) axxa (0,3)(1,1)(1,2)(2,2)(2,3)
+
+#E (a*)*(x) x (0,1)(0,0)(0,1)
+E (a*)*(x) x (0,1)(?,?)(0,1) RE2/Go
+E (a*)*(x) ax (0,2)(0,1)(1,2)
+E (a*)*(x) axa (0,2)(0,1)(1,2)
+
+E (a*)+(x) x (0,1)(0,0)(0,1)
+E (a*)+(x) ax (0,2)(0,1)(1,2)
+E (a*)+(x) axa (0,2)(0,1)(1,2)
+
+E (a*){2}(x) x (0,1)(0,0)(0,1)
+E (a*){2}(x) ax (0,2)(1,1)(1,2)
+E (a*){2}(x) axa (0,2)(1,1)(1,2)
diff --git a/vendor/regex-automata/data/tests/fowler/nullsubexpr.toml b/vendor/regex-automata/data/tests/fowler/nullsubexpr.toml
new file mode 100644
index 000000000..331067c60
--- /dev/null
+++ b/vendor/regex-automata/data/tests/fowler/nullsubexpr.toml
@@ -0,0 +1,350 @@
+[[tests]]
+name = "nullsubexpr3"
+options = ['escaped']
+pattern = '''(a*)*'''
+input = '''a'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "nullsubexpr5"
+options = ['escaped']
+pattern = '''(a*)*'''
+input = '''x'''
+matches = [[0, 0]]
+
+[[tests]]
+name = "nullsubexpr6"
+options = ['escaped']
+pattern = '''(a*)*'''
+input = '''aaaaaa'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "nullsubexpr7"
+options = ['escaped']
+pattern = '''(a*)*'''
+input = '''aaaaaax'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "nullsubexpr8"
+options = ['escaped']
+pattern = '''(a*)+'''
+input = '''a'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "nullsubexpr9"
+options = ['escaped']
+pattern = '''(a*)+'''
+input = '''x'''
+matches = [[0, 0]]
+
+[[tests]]
+name = "nullsubexpr10"
+options = ['escaped']
+pattern = '''(a*)+'''
+input = '''aaaaaa'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "nullsubexpr11"
+options = ['escaped']
+pattern = '''(a*)+'''
+input = '''aaaaaax'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "nullsubexpr12"
+options = ['escaped']
+pattern = '''(a+)*'''
+input = '''a'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "nullsubexpr13"
+options = ['escaped']
+pattern = '''(a+)*'''
+input = '''x'''
+matches = [[0, 0]]
+
+[[tests]]
+name = "nullsubexpr14"
+options = ['escaped']
+pattern = '''(a+)*'''
+input = '''aaaaaa'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "nullsubexpr15"
+options = ['escaped']
+pattern = '''(a+)*'''
+input = '''aaaaaax'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "nullsubexpr16"
+options = ['escaped']
+pattern = '''(a+)+'''
+input = '''a'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "nullsubexpr17"
+options = ['escaped']
+pattern = '''(a+)+'''
+input = '''x'''
+matches = []
+
+[[tests]]
+name = "nullsubexpr18"
+options = ['escaped']
+pattern = '''(a+)+'''
+input = '''aaaaaa'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "nullsubexpr19"
+options = ['escaped']
+pattern = '''(a+)+'''
+input = '''aaaaaax'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "nullsubexpr21"
+options = ['escaped']
+pattern = '''([a]*)*'''
+input = '''a'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "nullsubexpr23"
+options = ['escaped']
+pattern = '''([a]*)*'''
+input = '''x'''
+matches = [[0, 0]]
+
+[[tests]]
+name = "nullsubexpr24"
+options = ['escaped']
+pattern = '''([a]*)*'''
+input = '''aaaaaa'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "nullsubexpr25"
+options = ['escaped']
+pattern = '''([a]*)*'''
+input = '''aaaaaax'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "nullsubexpr26"
+options = ['escaped']
+pattern = '''([a]*)+'''
+input = '''a'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "nullsubexpr27"
+options = ['escaped']
+pattern = '''([a]*)+'''
+input = '''x'''
+matches = [[0, 0]]
+
+[[tests]]
+name = "nullsubexpr28"
+options = ['escaped']
+pattern = '''([a]*)+'''
+input = '''aaaaaa'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "nullsubexpr29"
+options = ['escaped']
+pattern = '''([a]*)+'''
+input = '''aaaaaax'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "nullsubexpr30"
+options = ['escaped']
+pattern = '''([^b]*)*'''
+input = '''a'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "nullsubexpr32"
+options = ['escaped']
+pattern = '''([^b]*)*'''
+input = '''b'''
+matches = [[0, 0]]
+
+[[tests]]
+name = "nullsubexpr33"
+options = ['escaped']
+pattern = '''([^b]*)*'''
+input = '''aaaaaa'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "nullsubexpr34"
+options = ['escaped']
+pattern = '''([^b]*)*'''
+input = '''aaaaaab'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "nullsubexpr35"
+options = ['escaped']
+pattern = '''([ab]*)*'''
+input = '''a'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "nullsubexpr36"
+options = ['escaped']
+pattern = '''([ab]*)*'''
+input = '''aaaaaa'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "nullsubexpr37"
+options = ['escaped']
+pattern = '''([ab]*)*'''
+input = '''ababab'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "nullsubexpr38"
+options = ['escaped']
+pattern = '''([ab]*)*'''
+input = '''bababa'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "nullsubexpr39"
+options = ['escaped']
+pattern = '''([ab]*)*'''
+input = '''b'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "nullsubexpr40"
+options = ['escaped']
+pattern = '''([ab]*)*'''
+input = '''bbbbbb'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "nullsubexpr41"
+options = ['escaped']
+pattern = '''([ab]*)*'''
+input = '''aaaabcde'''
+matches = [[0, 5]]
+
+[[tests]]
+name = "nullsubexpr42"
+options = ['escaped']
+pattern = '''([^a]*)*'''
+input = '''b'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "nullsubexpr43"
+options = ['escaped']
+pattern = '''([^a]*)*'''
+input = '''bbbbbb'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "nullsubexpr45"
+options = ['escaped']
+pattern = '''([^a]*)*'''
+input = '''aaaaaa'''
+matches = [[0, 0]]
+
+[[tests]]
+name = "nullsubexpr46"
+options = ['escaped']
+pattern = '''([^ab]*)*'''
+input = '''ccccxx'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "nullsubexpr48"
+options = ['escaped']
+pattern = '''([^ab]*)*'''
+input = '''ababab'''
+matches = [[0, 0]]
+
+[[tests]]
+name = "nullsubexpr50"
+options = ['escaped']
+pattern = '''((z)+|a)*'''
+input = '''zabcde'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "nullsubexpr69"
+options = ['escaped']
+pattern = '''(a*)*(x)'''
+input = '''x'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "nullsubexpr70"
+options = ['escaped']
+pattern = '''(a*)*(x)'''
+input = '''ax'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "nullsubexpr71"
+options = ['escaped']
+pattern = '''(a*)*(x)'''
+input = '''axa'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "nullsubexpr73"
+options = ['escaped']
+pattern = '''(a*)+(x)'''
+input = '''x'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "nullsubexpr74"
+options = ['escaped']
+pattern = '''(a*)+(x)'''
+input = '''ax'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "nullsubexpr75"
+options = ['escaped']
+pattern = '''(a*)+(x)'''
+input = '''axa'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "nullsubexpr77"
+options = ['escaped']
+pattern = '''(a*){2}(x)'''
+input = '''x'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "nullsubexpr78"
+options = ['escaped']
+pattern = '''(a*){2}(x)'''
+input = '''ax'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "nullsubexpr79"
+options = ['escaped']
+pattern = '''(a*){2}(x)'''
+input = '''axa'''
+matches = [[0, 2]]
+
diff --git a/vendor/regex-automata/data/tests/fowler/repetition-long.dat b/vendor/regex-automata/data/tests/fowler/repetition-long.dat
new file mode 100644
index 000000000..c91580236
--- /dev/null
+++ b/vendor/regex-automata/data/tests/fowler/repetition-long.dat
@@ -0,0 +1,85 @@
+NOTE implicit vs. explicit repetitions : 2009-02-02
+
+# Glenn Fowler <gsf@research.att.com>
+# conforming matches (column 4) must match one of the following BREs
+# NOMATCH
+# (0,.)\((\(.\),\(.\))(?,?)(\2,\3)\)*
+# (0,.)\((\(.\),\(.\))(\2,\3)(?,?)\)*
+# i.e., each 3-tuple has two identical elements and one (?,?)
+
+NOTE additional repetition tests graciously provided by Chris Kuklewicz www.haskell.org 2009-02-02
+
+:HA#100:E X(.?){0,}Y X1234567Y (0,9)(7,8)
+:HA#101:E X(.?){1,}Y X1234567Y (0,9)(7,8)
+:HA#102:E X(.?){2,}Y X1234567Y (0,9)(7,8)
+:HA#103:E X(.?){3,}Y X1234567Y (0,9)(7,8)
+:HA#104:E X(.?){4,}Y X1234567Y (0,9)(7,8)
+:HA#105:E X(.?){5,}Y X1234567Y (0,9)(7,8)
+:HA#106:E X(.?){6,}Y X1234567Y (0,9)(7,8)
+:HA#107:E X(.?){7,}Y X1234567Y (0,9)(7,8)
+:HA#108:E X(.?){8,}Y X1234567Y (0,9)(8,8)
+#:HA#110:E X(.?){0,8}Y X1234567Y (0,9)(7,8)
+:HA#110:E X(.?){0,8}Y X1234567Y (0,9)(8,8) RE2/Go
+#:HA#111:E X(.?){1,8}Y X1234567Y (0,9)(7,8)
+:HA#111:E X(.?){1,8}Y X1234567Y (0,9)(8,8) RE2/Go
+#:HA#112:E X(.?){2,8}Y X1234567Y (0,9)(7,8)
+:HA#112:E X(.?){2,8}Y X1234567Y (0,9)(8,8) RE2/Go
+#:HA#113:E X(.?){3,8}Y X1234567Y (0,9)(7,8)
+:HA#113:E X(.?){3,8}Y X1234567Y (0,9)(8,8) RE2/Go
+#:HA#114:E X(.?){4,8}Y X1234567Y (0,9)(7,8)
+:HA#114:E X(.?){4,8}Y X1234567Y (0,9)(8,8) RE2/Go
+#:HA#115:E X(.?){5,8}Y X1234567Y (0,9)(7,8)
+:HA#115:E X(.?){5,8}Y X1234567Y (0,9)(8,8) RE2/Go
+#:HA#116:E X(.?){6,8}Y X1234567Y (0,9)(7,8)
+:HA#116:E X(.?){6,8}Y X1234567Y (0,9)(8,8) RE2/Go
+#:HA#117:E X(.?){7,8}Y X1234567Y (0,9)(7,8)
+:HA#117:E X(.?){7,8}Y X1234567Y (0,9)(8,8) RE2/Go
+:HA#118:E X(.?){8,8}Y X1234567Y (0,9)(8,8)
+
+# These test a fixed bug in my regex-tdfa that did not keep the expanded
+# form properly grouped, so right association did the wrong thing with
+# these ambiguous patterns (crafted just to test my code when I became
+# suspicious of my implementation). The first subexpression should use
+# "ab" then "a" then "bcd".
+
+# OS X / FreeBSD / NetBSD badly fail many of these, with impossible
+# results like (0,6)(4,5)(6,6).
+
+:HA#260:E (a|ab|c|bcd){0,}(d*) ababcd (0,1)(0,1)(1,1)
+:HA#261:E (a|ab|c|bcd){1,}(d*) ababcd (0,1)(0,1)(1,1)
+:HA#262:E (a|ab|c|bcd){2,}(d*) ababcd (0,6)(3,6)(6,6)
+:HA#263:E (a|ab|c|bcd){3,}(d*) ababcd (0,6)(3,6)(6,6)
+:HA#264:E (a|ab|c|bcd){4,}(d*) ababcd NOMATCH
+:HA#265:E (a|ab|c|bcd){0,10}(d*) ababcd (0,1)(0,1)(1,1)
+:HA#266:E (a|ab|c|bcd){1,10}(d*) ababcd (0,1)(0,1)(1,1)
+:HA#267:E (a|ab|c|bcd){2,10}(d*) ababcd (0,6)(3,6)(6,6)
+:HA#268:E (a|ab|c|bcd){3,10}(d*) ababcd (0,6)(3,6)(6,6)
+:HA#269:E (a|ab|c|bcd){4,10}(d*) ababcd NOMATCH
+:HA#270:E (a|ab|c|bcd)*(d*) ababcd (0,1)(0,1)(1,1)
+:HA#271:E (a|ab|c|bcd)+(d*) ababcd (0,1)(0,1)(1,1)
+
+# The above worked on Linux/GLIBC but the following often fail.
+# They also trip up OS X / FreeBSD / NetBSD:
+
+#:HA#280:E (ab|a|c|bcd){0,}(d*) ababcd (0,6)(3,6)(6,6)
+:HA#280:E (ab|a|c|bcd){0,}(d*) ababcd (0,6)(4,5)(5,6) RE2/Go
+#:HA#281:E (ab|a|c|bcd){1,}(d*) ababcd (0,6)(3,6)(6,6)
+:HA#281:E (ab|a|c|bcd){1,}(d*) ababcd (0,6)(4,5)(5,6) RE2/Go
+#:HA#282:E (ab|a|c|bcd){2,}(d*) ababcd (0,6)(3,6)(6,6)
+:HA#282:E (ab|a|c|bcd){2,}(d*) ababcd (0,6)(4,5)(5,6) RE2/Go
+#:HA#283:E (ab|a|c|bcd){3,}(d*) ababcd (0,6)(3,6)(6,6)
+:HA#283:E (ab|a|c|bcd){3,}(d*) ababcd (0,6)(4,5)(5,6) RE2/Go
+:HA#284:E (ab|a|c|bcd){4,}(d*) ababcd NOMATCH
+#:HA#285:E (ab|a|c|bcd){0,10}(d*) ababcd (0,6)(3,6)(6,6)
+:HA#285:E (ab|a|c|bcd){0,10}(d*) ababcd (0,6)(4,5)(5,6) RE2/Go
+#:HA#286:E (ab|a|c|bcd){1,10}(d*) ababcd (0,6)(3,6)(6,6)
+:HA#286:E (ab|a|c|bcd){1,10}(d*) ababcd (0,6)(4,5)(5,6) RE2/Go
+#:HA#287:E (ab|a|c|bcd){2,10}(d*) ababcd (0,6)(3,6)(6,6)
+:HA#287:E (ab|a|c|bcd){2,10}(d*) ababcd (0,6)(4,5)(5,6) RE2/Go
+#:HA#288:E (ab|a|c|bcd){3,10}(d*) ababcd (0,6)(3,6)(6,6)
+:HA#288:E (ab|a|c|bcd){3,10}(d*) ababcd (0,6)(4,5)(5,6) RE2/Go
+:HA#289:E (ab|a|c|bcd){4,10}(d*) ababcd NOMATCH
+#:HA#290:E (ab|a|c|bcd)*(d*) ababcd (0,6)(3,6)(6,6)
+:HA#290:E (ab|a|c|bcd)*(d*) ababcd (0,6)(4,5)(5,6) RE2/Go
+#:HA#291:E (ab|a|c|bcd)+(d*) ababcd (0,6)(3,6)(6,6)
+:HA#291:E (ab|a|c|bcd)+(d*) ababcd (0,6)(4,5)(5,6) RE2/Go
diff --git a/vendor/regex-automata/data/tests/fowler/repetition-long.toml b/vendor/regex-automata/data/tests/fowler/repetition-long.toml
new file mode 100644
index 000000000..e0b2ea76b
--- /dev/null
+++ b/vendor/regex-automata/data/tests/fowler/repetition-long.toml
@@ -0,0 +1,294 @@
+[[tests]]
+name = "repetition-long12"
+options = ['escaped']
+pattern = '''X(.?){0,}Y'''
+input = '''X1234567Y'''
+matches = [[0, 9]]
+
+[[tests]]
+name = "repetition-long13"
+options = ['escaped']
+pattern = '''X(.?){1,}Y'''
+input = '''X1234567Y'''
+matches = [[0, 9]]
+
+[[tests]]
+name = "repetition-long14"
+options = ['escaped']
+pattern = '''X(.?){2,}Y'''
+input = '''X1234567Y'''
+matches = [[0, 9]]
+
+[[tests]]
+name = "repetition-long15"
+options = ['escaped']
+pattern = '''X(.?){3,}Y'''
+input = '''X1234567Y'''
+matches = [[0, 9]]
+
+[[tests]]
+name = "repetition-long16"
+options = ['escaped']
+pattern = '''X(.?){4,}Y'''
+input = '''X1234567Y'''
+matches = [[0, 9]]
+
+[[tests]]
+name = "repetition-long17"
+options = ['escaped']
+pattern = '''X(.?){5,}Y'''
+input = '''X1234567Y'''
+matches = [[0, 9]]
+
+[[tests]]
+name = "repetition-long18"
+options = ['escaped']
+pattern = '''X(.?){6,}Y'''
+input = '''X1234567Y'''
+matches = [[0, 9]]
+
+[[tests]]
+name = "repetition-long19"
+options = ['escaped']
+pattern = '''X(.?){7,}Y'''
+input = '''X1234567Y'''
+matches = [[0, 9]]
+
+[[tests]]
+name = "repetition-long20"
+options = ['escaped']
+pattern = '''X(.?){8,}Y'''
+input = '''X1234567Y'''
+matches = [[0, 9]]
+
+[[tests]]
+name = "repetition-long22"
+options = ['escaped']
+pattern = '''X(.?){0,8}Y'''
+input = '''X1234567Y'''
+matches = [[0, 9]]
+
+[[tests]]
+name = "repetition-long24"
+options = ['escaped']
+pattern = '''X(.?){1,8}Y'''
+input = '''X1234567Y'''
+matches = [[0, 9]]
+
+[[tests]]
+name = "repetition-long26"
+options = ['escaped']
+pattern = '''X(.?){2,8}Y'''
+input = '''X1234567Y'''
+matches = [[0, 9]]
+
+[[tests]]
+name = "repetition-long28"
+options = ['escaped']
+pattern = '''X(.?){3,8}Y'''
+input = '''X1234567Y'''
+matches = [[0, 9]]
+
+[[tests]]
+name = "repetition-long30"
+options = ['escaped']
+pattern = '''X(.?){4,8}Y'''
+input = '''X1234567Y'''
+matches = [[0, 9]]
+
+[[tests]]
+name = "repetition-long32"
+options = ['escaped']
+pattern = '''X(.?){5,8}Y'''
+input = '''X1234567Y'''
+matches = [[0, 9]]
+
+[[tests]]
+name = "repetition-long34"
+options = ['escaped']
+pattern = '''X(.?){6,8}Y'''
+input = '''X1234567Y'''
+matches = [[0, 9]]
+
+[[tests]]
+name = "repetition-long36"
+options = ['escaped']
+pattern = '''X(.?){7,8}Y'''
+input = '''X1234567Y'''
+matches = [[0, 9]]
+
+[[tests]]
+name = "repetition-long37"
+options = ['escaped']
+pattern = '''X(.?){8,8}Y'''
+input = '''X1234567Y'''
+matches = [[0, 9]]
+
+[[tests]]
+name = "repetition-long48"
+options = ['escaped']
+pattern = '''(a|ab|c|bcd){0,}(d*)'''
+input = '''ababcd'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "repetition-long49"
+options = ['escaped']
+pattern = '''(a|ab|c|bcd){1,}(d*)'''
+input = '''ababcd'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "repetition-long50"
+options = ['escaped']
+pattern = '''(a|ab|c|bcd){2,}(d*)'''
+input = '''ababcd'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "repetition-long51"
+options = ['escaped']
+pattern = '''(a|ab|c|bcd){3,}(d*)'''
+input = '''ababcd'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "repetition-long52"
+options = ['escaped']
+pattern = '''(a|ab|c|bcd){4,}(d*)'''
+input = '''ababcd'''
+matches = []
+
+[[tests]]
+name = "repetition-long53"
+options = ['escaped']
+pattern = '''(a|ab|c|bcd){0,10}(d*)'''
+input = '''ababcd'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "repetition-long54"
+options = ['escaped']
+pattern = '''(a|ab|c|bcd){1,10}(d*)'''
+input = '''ababcd'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "repetition-long55"
+options = ['escaped']
+pattern = '''(a|ab|c|bcd){2,10}(d*)'''
+input = '''ababcd'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "repetition-long56"
+options = ['escaped']
+pattern = '''(a|ab|c|bcd){3,10}(d*)'''
+input = '''ababcd'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "repetition-long57"
+options = ['escaped']
+pattern = '''(a|ab|c|bcd){4,10}(d*)'''
+input = '''ababcd'''
+matches = []
+
+[[tests]]
+name = "repetition-long58"
+options = ['escaped']
+pattern = '''(a|ab|c|bcd)*(d*)'''
+input = '''ababcd'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "repetition-long59"
+options = ['escaped']
+pattern = '''(a|ab|c|bcd)+(d*)'''
+input = '''ababcd'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "repetition-long65"
+options = ['escaped']
+pattern = '''(ab|a|c|bcd){0,}(d*)'''
+input = '''ababcd'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "repetition-long67"
+options = ['escaped']
+pattern = '''(ab|a|c|bcd){1,}(d*)'''
+input = '''ababcd'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "repetition-long69"
+options = ['escaped']
+pattern = '''(ab|a|c|bcd){2,}(d*)'''
+input = '''ababcd'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "repetition-long71"
+options = ['escaped']
+pattern = '''(ab|a|c|bcd){3,}(d*)'''
+input = '''ababcd'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "repetition-long72"
+options = ['escaped']
+pattern = '''(ab|a|c|bcd){4,}(d*)'''
+input = '''ababcd'''
+matches = []
+
+[[tests]]
+name = "repetition-long74"
+options = ['escaped']
+pattern = '''(ab|a|c|bcd){0,10}(d*)'''
+input = '''ababcd'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "repetition-long76"
+options = ['escaped']
+pattern = '''(ab|a|c|bcd){1,10}(d*)'''
+input = '''ababcd'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "repetition-long78"
+options = ['escaped']
+pattern = '''(ab|a|c|bcd){2,10}(d*)'''
+input = '''ababcd'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "repetition-long80"
+options = ['escaped']
+pattern = '''(ab|a|c|bcd){3,10}(d*)'''
+input = '''ababcd'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "repetition-long81"
+options = ['escaped']
+pattern = '''(ab|a|c|bcd){4,10}(d*)'''
+input = '''ababcd'''
+matches = []
+
+[[tests]]
+name = "repetition-long83"
+options = ['escaped']
+pattern = '''(ab|a|c|bcd)*(d*)'''
+input = '''ababcd'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "repetition-long85"
+options = ['escaped']
+pattern = '''(ab|a|c|bcd)+(d*)'''
+input = '''ababcd'''
+matches = [[0, 6]]
+
diff --git a/vendor/regex-automata/data/tests/fowler/repetition.dat b/vendor/regex-automata/data/tests/fowler/repetition.dat
new file mode 100644
index 000000000..2dac0823f
--- /dev/null
+++ b/vendor/regex-automata/data/tests/fowler/repetition.dat
@@ -0,0 +1,83 @@
+NOTE implicit vs. explicit repetitions : 2009-02-02
+
+# Glenn Fowler <gsf@research.att.com>
+# conforming matches (column 4) must match one of the following BREs
+# NOMATCH
+# (0,.)\((\(.\),\(.\))(?,?)(\2,\3)\)*
+# (0,.)\((\(.\),\(.\))(\2,\3)(?,?)\)*
+# i.e., each 3-tuple has two identical elements and one (?,?)
+
+E ((..)|(.)) NULL NOMATCH
+E ((..)|(.))((..)|(.)) NULL NOMATCH
+E ((..)|(.))((..)|(.))((..)|(.)) NULL NOMATCH
+
+E ((..)|(.)){1} NULL NOMATCH
+E ((..)|(.)){2} NULL NOMATCH
+E ((..)|(.)){3} NULL NOMATCH
+
+E ((..)|(.))* NULL (0,0)
+
+E ((..)|(.)) a (0,1)(0,1)(?,?)(0,1)
+E ((..)|(.))((..)|(.)) a NOMATCH
+E ((..)|(.))((..)|(.))((..)|(.)) a NOMATCH
+
+E ((..)|(.)){1} a (0,1)(0,1)(?,?)(0,1)
+E ((..)|(.)){2} a NOMATCH
+E ((..)|(.)){3} a NOMATCH
+
+E ((..)|(.))* a (0,1)(0,1)(?,?)(0,1)
+
+E ((..)|(.)) aa (0,2)(0,2)(0,2)(?,?)
+E ((..)|(.))((..)|(.)) aa (0,2)(0,1)(?,?)(0,1)(1,2)(?,?)(1,2)
+E ((..)|(.))((..)|(.))((..)|(.)) aa NOMATCH
+
+E ((..)|(.)){1} aa (0,2)(0,2)(0,2)(?,?)
+E ((..)|(.)){2} aa (0,2)(1,2)(?,?)(1,2)
+E ((..)|(.)){3} aa NOMATCH
+
+E ((..)|(.))* aa (0,2)(0,2)(0,2)(?,?)
+
+E ((..)|(.)) aaa (0,2)(0,2)(0,2)(?,?)
+E ((..)|(.))((..)|(.)) aaa (0,3)(0,2)(0,2)(?,?)(2,3)(?,?)(2,3)
+E ((..)|(.))((..)|(.))((..)|(.)) aaa (0,3)(0,1)(?,?)(0,1)(1,2)(?,?)(1,2)(2,3)(?,?)(2,3)
+
+E ((..)|(.)){1} aaa (0,2)(0,2)(0,2)(?,?)
+#E ((..)|(.)){2} aaa (0,3)(2,3)(?,?)(2,3)
+E ((..)|(.)){2} aaa (0,3)(2,3)(0,2)(2,3) RE2/Go
+E ((..)|(.)){3} aaa (0,3)(2,3)(?,?)(2,3)
+
+#E ((..)|(.))* aaa (0,3)(2,3)(?,?)(2,3)
+E ((..)|(.))* aaa (0,3)(2,3)(0,2)(2,3) RE2/Go
+
+E ((..)|(.)) aaaa (0,2)(0,2)(0,2)(?,?)
+E ((..)|(.))((..)|(.)) aaaa (0,4)(0,2)(0,2)(?,?)(2,4)(2,4)(?,?)
+E ((..)|(.))((..)|(.))((..)|(.)) aaaa (0,4)(0,2)(0,2)(?,?)(2,3)(?,?)(2,3)(3,4)(?,?)(3,4)
+
+E ((..)|(.)){1} aaaa (0,2)(0,2)(0,2)(?,?)
+E ((..)|(.)){2} aaaa (0,4)(2,4)(2,4)(?,?)
+#E ((..)|(.)){3} aaaa (0,4)(3,4)(?,?)(3,4)
+E ((..)|(.)){3} aaaa (0,4)(3,4)(0,2)(3,4) RE2/Go
+
+E ((..)|(.))* aaaa (0,4)(2,4)(2,4)(?,?)
+
+E ((..)|(.)) aaaaa (0,2)(0,2)(0,2)(?,?)
+E ((..)|(.))((..)|(.)) aaaaa (0,4)(0,2)(0,2)(?,?)(2,4)(2,4)(?,?)
+E ((..)|(.))((..)|(.))((..)|(.)) aaaaa (0,5)(0,2)(0,2)(?,?)(2,4)(2,4)(?,?)(4,5)(?,?)(4,5)
+
+E ((..)|(.)){1} aaaaa (0,2)(0,2)(0,2)(?,?)
+E ((..)|(.)){2} aaaaa (0,4)(2,4)(2,4)(?,?)
+#E ((..)|(.)){3} aaaaa (0,5)(4,5)(?,?)(4,5)
+E ((..)|(.)){3} aaaaa (0,5)(4,5)(2,4)(4,5) RE2/Go
+
+#E ((..)|(.))* aaaaa (0,5)(4,5)(?,?)(4,5)
+E ((..)|(.))* aaaaa (0,5)(4,5)(2,4)(4,5) RE2/Go
+
+E ((..)|(.)) aaaaaa (0,2)(0,2)(0,2)(?,?)
+E ((..)|(.))((..)|(.)) aaaaaa (0,4)(0,2)(0,2)(?,?)(2,4)(2,4)(?,?)
+E ((..)|(.))((..)|(.))((..)|(.)) aaaaaa (0,6)(0,2)(0,2)(?,?)(2,4)(2,4)(?,?)(4,6)(4,6)(?,?)
+
+E ((..)|(.)){1} aaaaaa (0,2)(0,2)(0,2)(?,?)
+E ((..)|(.)){2} aaaaaa (0,4)(2,4)(2,4)(?,?)
+E ((..)|(.)){3} aaaaaa (0,6)(4,6)(4,6)(?,?)
+
+E ((..)|(.))* aaaaaa (0,6)(4,6)(4,6)(?,?)
diff --git a/vendor/regex-automata/data/tests/fowler/repetition.toml b/vendor/regex-automata/data/tests/fowler/repetition.toml
new file mode 100644
index 000000000..43280a409
--- /dev/null
+++ b/vendor/regex-automata/data/tests/fowler/repetition.toml
@@ -0,0 +1,343 @@
+[[tests]]
+name = "repetition10"
+options = ['escaped']
+pattern = '''((..)|(.))'''
+input = ''''''
+matches = []
+
+[[tests]]
+name = "repetition11"
+options = ['escaped']
+pattern = '''((..)|(.))((..)|(.))'''
+input = ''''''
+matches = []
+
+[[tests]]
+name = "repetition12"
+options = ['escaped']
+pattern = '''((..)|(.))((..)|(.))((..)|(.))'''
+input = ''''''
+matches = []
+
+[[tests]]
+name = "repetition14"
+options = ['escaped']
+pattern = '''((..)|(.)){1}'''
+input = ''''''
+matches = []
+
+[[tests]]
+name = "repetition15"
+options = ['escaped']
+pattern = '''((..)|(.)){2}'''
+input = ''''''
+matches = []
+
+[[tests]]
+name = "repetition16"
+options = ['escaped']
+pattern = '''((..)|(.)){3}'''
+input = ''''''
+matches = []
+
+[[tests]]
+name = "repetition18"
+options = ['escaped']
+pattern = '''((..)|(.))*'''
+input = ''''''
+matches = [[0, 0]]
+
+[[tests]]
+name = "repetition20"
+options = ['escaped']
+pattern = '''((..)|(.))'''
+input = '''a'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "repetition21"
+options = ['escaped']
+pattern = '''((..)|(.))((..)|(.))'''
+input = '''a'''
+matches = []
+
+[[tests]]
+name = "repetition22"
+options = ['escaped']
+pattern = '''((..)|(.))((..)|(.))((..)|(.))'''
+input = '''a'''
+matches = []
+
+[[tests]]
+name = "repetition24"
+options = ['escaped']
+pattern = '''((..)|(.)){1}'''
+input = '''a'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "repetition25"
+options = ['escaped']
+pattern = '''((..)|(.)){2}'''
+input = '''a'''
+matches = []
+
+[[tests]]
+name = "repetition26"
+options = ['escaped']
+pattern = '''((..)|(.)){3}'''
+input = '''a'''
+matches = []
+
+[[tests]]
+name = "repetition28"
+options = ['escaped']
+pattern = '''((..)|(.))*'''
+input = '''a'''
+matches = [[0, 1]]
+
+[[tests]]
+name = "repetition30"
+options = ['escaped']
+pattern = '''((..)|(.))'''
+input = '''aa'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "repetition31"
+options = ['escaped']
+pattern = '''((..)|(.))((..)|(.))'''
+input = '''aa'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "repetition32"
+options = ['escaped']
+pattern = '''((..)|(.))((..)|(.))((..)|(.))'''
+input = '''aa'''
+matches = []
+
+[[tests]]
+name = "repetition34"
+options = ['escaped']
+pattern = '''((..)|(.)){1}'''
+input = '''aa'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "repetition35"
+options = ['escaped']
+pattern = '''((..)|(.)){2}'''
+input = '''aa'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "repetition36"
+options = ['escaped']
+pattern = '''((..)|(.)){3}'''
+input = '''aa'''
+matches = []
+
+[[tests]]
+name = "repetition38"
+options = ['escaped']
+pattern = '''((..)|(.))*'''
+input = '''aa'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "repetition40"
+options = ['escaped']
+pattern = '''((..)|(.))'''
+input = '''aaa'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "repetition41"
+options = ['escaped']
+pattern = '''((..)|(.))((..)|(.))'''
+input = '''aaa'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "repetition42"
+options = ['escaped']
+pattern = '''((..)|(.))((..)|(.))((..)|(.))'''
+input = '''aaa'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "repetition44"
+options = ['escaped']
+pattern = '''((..)|(.)){1}'''
+input = '''aaa'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "repetition46"
+options = ['escaped']
+pattern = '''((..)|(.)){2}'''
+input = '''aaa'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "repetition47"
+options = ['escaped']
+pattern = '''((..)|(.)){3}'''
+input = '''aaa'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "repetition50"
+options = ['escaped']
+pattern = '''((..)|(.))*'''
+input = '''aaa'''
+matches = [[0, 3]]
+
+[[tests]]
+name = "repetition52"
+options = ['escaped']
+pattern = '''((..)|(.))'''
+input = '''aaaa'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "repetition53"
+options = ['escaped']
+pattern = '''((..)|(.))((..)|(.))'''
+input = '''aaaa'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "repetition54"
+options = ['escaped']
+pattern = '''((..)|(.))((..)|(.))((..)|(.))'''
+input = '''aaaa'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "repetition56"
+options = ['escaped']
+pattern = '''((..)|(.)){1}'''
+input = '''aaaa'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "repetition57"
+options = ['escaped']
+pattern = '''((..)|(.)){2}'''
+input = '''aaaa'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "repetition59"
+options = ['escaped']
+pattern = '''((..)|(.)){3}'''
+input = '''aaaa'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "repetition61"
+options = ['escaped']
+pattern = '''((..)|(.))*'''
+input = '''aaaa'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "repetition63"
+options = ['escaped']
+pattern = '''((..)|(.))'''
+input = '''aaaaa'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "repetition64"
+options = ['escaped']
+pattern = '''((..)|(.))((..)|(.))'''
+input = '''aaaaa'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "repetition65"
+options = ['escaped']
+pattern = '''((..)|(.))((..)|(.))((..)|(.))'''
+input = '''aaaaa'''
+matches = [[0, 5]]
+
+[[tests]]
+name = "repetition67"
+options = ['escaped']
+pattern = '''((..)|(.)){1}'''
+input = '''aaaaa'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "repetition68"
+options = ['escaped']
+pattern = '''((..)|(.)){2}'''
+input = '''aaaaa'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "repetition70"
+options = ['escaped']
+pattern = '''((..)|(.)){3}'''
+input = '''aaaaa'''
+matches = [[0, 5]]
+
+[[tests]]
+name = "repetition73"
+options = ['escaped']
+pattern = '''((..)|(.))*'''
+input = '''aaaaa'''
+matches = [[0, 5]]
+
+[[tests]]
+name = "repetition75"
+options = ['escaped']
+pattern = '''((..)|(.))'''
+input = '''aaaaaa'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "repetition76"
+options = ['escaped']
+pattern = '''((..)|(.))((..)|(.))'''
+input = '''aaaaaa'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "repetition77"
+options = ['escaped']
+pattern = '''((..)|(.))((..)|(.))((..)|(.))'''
+input = '''aaaaaa'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "repetition79"
+options = ['escaped']
+pattern = '''((..)|(.)){1}'''
+input = '''aaaaaa'''
+matches = [[0, 2]]
+
+[[tests]]
+name = "repetition80"
+options = ['escaped']
+pattern = '''((..)|(.)){2}'''
+input = '''aaaaaa'''
+matches = [[0, 4]]
+
+[[tests]]
+name = "repetition81"
+options = ['escaped']
+pattern = '''((..)|(.)){3}'''
+input = '''aaaaaa'''
+matches = [[0, 6]]
+
+[[tests]]
+name = "repetition83"
+options = ['escaped']
+pattern = '''((..)|(.))*'''
+input = '''aaaaaa'''
+matches = [[0, 6]]
+
diff --git a/vendor/regex-automata/data/tests/iter.toml b/vendor/regex-automata/data/tests/iter.toml
new file mode 100644
index 000000000..30abae86e
--- /dev/null
+++ b/vendor/regex-automata/data/tests/iter.toml
@@ -0,0 +1,92 @@
+[[tests]]
+name = "iter1"
+pattern = "a"
+input = "aaa"
+matches = [[0, 1], [1, 2], [2, 3]]
+
+[[tests]]
+name = "iter2"
+pattern = "a"
+input = "aba"
+matches = [[0, 1], [2, 3]]
+
+[[tests]]
+name = "iter-empty1"
+pattern = ''
+input = ''
+matches = [[0, 0]]
+
+[[tests]]
+name = "iter-empty2"
+pattern = ''
+input = 'abc'
+matches = [[0, 0], [1, 1], [2, 2], [3, 3]]
+
+[[tests]]
+name = "iter-empty3"
+pattern = '()'
+input = 'abc'
+matches = [[0, 0], [1, 1], [2, 2], [3, 3]]
+
+[[tests]]
+name = "iter-empty4"
+pattern = '()*'
+input = 'abc'
+matches = [[0, 0], [1, 1], [2, 2], [3, 3]]
+
+[[tests]]
+name = "iter-empty5"
+pattern = '()+'
+input = 'abc'
+matches = [[0, 0], [1, 1], [2, 2], [3, 3]]
+
+[[tests]]
+name = "iter-empty6"
+pattern = '()?'
+input = 'abc'
+matches = [[0, 0], [1, 1], [2, 2], [3, 3]]
+
+[[tests]]
+name = "iter-empty7"
+pattern = '()()'
+input = 'abc'
+matches = [[0, 0], [1, 1], [2, 2], [3, 3]]
+
+[[tests]]
+name = "iter-empty8"
+pattern = '()+|z'
+input = 'abc'
+matches = [[0, 0], [1, 1], [2, 2], [3, 3]]
+
+[[tests]]
+name = "iter-empty9"
+pattern = 'z|()+'
+input = 'abc'
+matches = [[0, 0], [1, 1], [2, 2], [3, 3]]
+
+[[tests]]
+name = "iter-empty10"
+pattern = '()+|b'
+input = 'abc'
+matches = [[0, 0], [1, 1], [2, 2], [3, 3]]
+
+[[tests]]
+name = "iter-empty11"
+pattern = 'b|()+'
+input = 'abc'
+matches = [[0, 0], [1, 2], [3, 3]]
+
+
+[[tests]]
+options = ["anchored"]
+name = "iter-anchored1"
+pattern = "a"
+input = "a"
+matches = [[0, 1]]
+
+[[tests]]
+options = ["anchored"]
+name = "iter-anchored2"
+pattern = "a"
+input = "aa"
+matches = [[0, 1]]
diff --git a/vendor/regex-automata/data/tests/no-unicode.toml b/vendor/regex-automata/data/tests/no-unicode.toml
new file mode 100644
index 000000000..16e02b426
--- /dev/null
+++ b/vendor/regex-automata/data/tests/no-unicode.toml
@@ -0,0 +1,138 @@
+[[tests]]
+name = "invalid-utf8-literal1"
+options = ["escaped", "invalid-utf8", "no-unicode"]
+pattern = '\xFF'
+input = '\xFF'
+matches = [[0, 1]]
+
+
+[[tests]]
+name = "no-unicode-mixed"
+options = ["escaped", "invalid-utf8"]
+pattern = '(.+)(?-u)(.+)'
+input = '\xCE\x93\xCE\x94\xFF'
+matches = [[0, 5]]
+
+
+[[tests]]
+name = "no-unicode-case1"
+options = ["case-insensitive", "no-unicode"]
+pattern = "a"
+input = "A"
+matches = [[0, 1]]
+
+[[tests]]
+name = "no-unicode-case2"
+options = ["case-insensitive", "no-unicode"]
+pattern = "[a-z]+"
+input = "AaAaA"
+matches = [[0, 5]]
+
+[[tests]]
+name = "no-unicode-case3"
+options = ["case-insensitive"]
+pattern = "[a-z]+"
+input = "aA\u212AaA"
+matches = [[0, 7]]
+
+[[tests]]
+name = "no-unicode-case4"
+options = ["case-insensitive", "no-unicode"]
+pattern = "[a-z]+"
+input = "aA\u212AaA"
+matches = [[0, 2]]
+
+
+[[tests]]
+name = "no-unicode-negate1"
+options = []
+pattern = "[^a]"
+input = "δ"
+matches = [[0, 2]]
+
+[[tests]]
+name = "no-unicode-negate2"
+options = ["no-unicode", "invalid-utf8"]
+pattern = "[^a]"
+input = "δ"
+matches = [[0, 1]]
+
+
+[[tests]]
+name = "no-unicode-dotstar-prefix1"
+options = ["escaped", "no-unicode", "invalid-utf8"]
+pattern = "a"
+input = '\xFFa'
+matches = [[1, 2]]
+
+[[tests]]
+name = "no-unicode-dotstar-prefix2"
+options = ["escaped", "invalid-utf8"]
+pattern = "a"
+input = '\xFFa'
+matches = [[1, 2]]
+
+
+[[tests]]
+name = "no-unicode-null-bytes1"
+options = ["escaped", "no-unicode", "invalid-utf8"]
+pattern = '[^\x00]+\x00'
+input = 'foo\x00'
+matches = [[0, 4]]
+
+
+[[tests]]
+name = "no-unicode1"
+options = ["no-unicode"]
+pattern = '\w+'
+input = "aδ"
+matches = [[0, 1]]
+
+[[tests]]
+name = "no-unicode2"
+options = []
+pattern = '\w+'
+input = "aδ"
+matches = [[0, 3]]
+
+[[tests]]
+name = "no-unicode3"
+options = ["no-unicode"]
+pattern = '\d+'
+input = "1२३9"
+matches = [[0, 1]]
+
+[[tests]]
+name = "no-unicode4"
+pattern = '\d+'
+input = "1२३9"
+matches = [[0, 8]]
+
+[[tests]]
+name = "no-unicode5"
+options = ["no-unicode"]
+pattern = '\s+'
+input = " \u1680"
+matches = [[0, 1]]
+
+[[tests]]
+name = "no-unicode6"
+pattern = '\s+'
+input = " \u1680"
+matches = [[0, 4]]
+
+
+[[tests]]
+# See: https://github.com/rust-lang/regex/issues/484
+name = "no-unicode-iter1"
+pattern = ''
+input = "☃"
+matches = [[0, 0], [1, 1], [2, 2], [3, 3]]
+
+[[tests]]
+# See: https://github.com/rust-lang/regex/issues/484
+options = ['escaped']
+name = "no-unicode-iter2"
+pattern = ''
+input = 'b\xFFr'
+matches = [[0, 0], [1, 1], [2, 2], [3, 3]]
diff --git a/vendor/regex-automata/data/tests/unicode.toml b/vendor/regex-automata/data/tests/unicode.toml
new file mode 100644
index 000000000..845393f28
--- /dev/null
+++ b/vendor/regex-automata/data/tests/unicode.toml
@@ -0,0 +1,489 @@
+[[tests]]
+name = "unicode-literal1"
+pattern = '☃'
+input = "☃"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-literal2"
+pattern = '☃+'
+input = "☃"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-literal3"
+options = ["case-insensitive"]
+pattern = '☃+'
+input = "☃"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-literal4"
+options = ["case-insensitive"]
+pattern = 'Δ'
+input = "δ"
+matches = [[0, 2]]
+
+
+[[tests]]
+name = "unicode-class1"
+pattern = '[☃Ⅰ]+'
+input = "☃"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-class2"
+pattern = '\pN'
+input = "Ⅰ"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-class3"
+pattern = '\pN+'
+input = "Ⅰ1Ⅱ2"
+matches = [[0, 8]]
+
+[[tests]]
+name = "unicode-class4"
+pattern = '\PN+'
+input = "abⅠ"
+matches = [[0, 2]]
+
+[[tests]]
+name = "unicode-class5"
+pattern = '[\PN]+'
+input = "abⅠ"
+matches = [[0, 2]]
+
+[[tests]]
+name = "unicode-class6"
+pattern = '[^\PN]+'
+input = "abⅠ"
+matches = [[2, 5]]
+
+[[tests]]
+name = "unicode-class7"
+pattern = '\p{Lu}+'
+input = "ΛΘΓΔα"
+matches = [[0, 8]]
+
+[[tests]]
+name = "unicode-class8"
+options = ["case-insensitive"]
+pattern = '\p{Lu}+'
+input = "ΛΘΓΔα"
+matches = [[0, 10]]
+
+[[tests]]
+name = "unicode-class9"
+pattern = '\pL+'
+input = "ΛΘΓΔα"
+matches = [[0, 10]]
+
+[[tests]]
+name = "unicode-class10"
+pattern = '\p{Ll}+'
+input = "ΛΘΓΔα"
+matches = [[8, 10]]
+
+
+[[tests]]
+name = "unicode-perl1"
+pattern = '\w+'
+input = "dδd"
+matches = [[0, 4]]
+
+[[tests]]
+name = "unicode-perl2"
+pattern = '\w+'
+input = "⥡"
+matches = []
+
+[[tests]]
+name = "unicode-perl3"
+pattern = '\W+'
+input = "⥡"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-perl4"
+pattern = '\d+'
+input = "1२३9"
+matches = [[0, 8]]
+
+[[tests]]
+name = "unicode-perl5"
+pattern = '\d+'
+input = "Ⅱ"
+matches = []
+
+[[tests]]
+name = "unicode-perl6"
+pattern = '\D+'
+input = "Ⅱ"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-perl7"
+pattern = '\s+'
+input = " "
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-perl8"
+pattern = '\s+'
+input = "☃"
+matches = []
+
+[[tests]]
+name = "unicode-perl9"
+pattern = '\S+'
+input = "☃"
+matches = [[0, 3]]
+
+
+[[tests]]
+name = "unicode-class-gencat1"
+pattern = '\p{Cased_Letter}'
+input = "A"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-class-gencat2"
+pattern = '\p{Close_Punctuation}'
+input = "❯"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-class-gencat3"
+pattern = '\p{Connector_Punctuation}'
+input = "⁀"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-class-gencat4"
+pattern = '\p{Control}'
+input = "\u009F"
+matches = [[0, 2]]
+
+[[tests]]
+name = "unicode-class-gencat5"
+pattern = '\p{Currency_Symbol}'
+input = "£"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-class-gencat6"
+pattern = '\p{Dash_Punctuation}'
+input = "〰"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-class-gencat7"
+pattern = '\p{Decimal_Number}'
+input = "𑓙"
+matches = [[0, 4]]
+
+[[tests]]
+name = "unicode-class-gencat8"
+pattern = '\p{Enclosing_Mark}'
+input = "\uA672"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-class-gencat9"
+pattern = '\p{Final_Punctuation}'
+input = "⸡"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-class-gencat10"
+pattern = '\p{Format}'
+input = "\U000E007F"
+matches = [[0, 4]]
+
+[[tests]]
+name = "unicode-class-gencat11"
+pattern = '\p{Initial_Punctuation}'
+input = "⸜"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-class-gencat12"
+pattern = '\p{Letter}'
+input = "Έ"
+matches = [[0, 2]]
+
+[[tests]]
+name = "unicode-class-gencat13"
+pattern = '\p{Letter_Number}'
+input = "ↂ"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-class-gencat14"
+pattern = '\p{Line_Separator}'
+input = "\u2028"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-class-gencat15"
+pattern = '\p{Lowercase_Letter}'
+input = "ϛ"
+matches = [[0, 2]]
+
+[[tests]]
+name = "unicode-class-gencat16"
+pattern = '\p{Mark}'
+input = "\U000E01EF"
+matches = [[0, 4]]
+
+[[tests]]
+name = "unicode-class-gencat17"
+pattern = '\p{Math}'
+input = "⋿"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-class-gencat18"
+pattern = '\p{Modifier_Letter}'
+input = "𖭃"
+matches = [[0, 4]]
+
+[[tests]]
+name = "unicode-class-gencat19"
+pattern = '\p{Modifier_Symbol}'
+input = "🏿"
+matches = [[0, 4]]
+
+[[tests]]
+name = "unicode-class-gencat20"
+pattern = '\p{Nonspacing_Mark}'
+input = "\U0001E94A"
+matches = [[0, 4]]
+
+[[tests]]
+name = "unicode-class-gencat21"
+pattern = '\p{Number}'
+input = "⓿"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-class-gencat22"
+pattern = '\p{Open_Punctuation}'
+input = "⦅"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-class-gencat23"
+pattern = '\p{Other}'
+input = "\u0BC9"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-class-gencat24"
+pattern = '\p{Other_Letter}'
+input = "ꓷ"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-class-gencat25"
+pattern = '\p{Other_Number}'
+input = "㉏"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-class-gencat26"
+pattern = '\p{Other_Punctuation}'
+input = "𞥞"
+matches = [[0, 4]]
+
+[[tests]]
+name = "unicode-class-gencat27"
+pattern = '\p{Other_Symbol}'
+input = "⅌"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-class-gencat28"
+pattern = '\p{Paragraph_Separator}'
+input = "\u2029"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-class-gencat29"
+pattern = '\p{Private_Use}'
+input = "\U0010FFFD"
+matches = [[0, 4]]
+
+[[tests]]
+name = "unicode-class-gencat30"
+pattern = '\p{Punctuation}'
+input = "𑁍"
+matches = [[0, 4]]
+
+[[tests]]
+name = "unicode-class-gencat31"
+pattern = '\p{Separator}'
+input = "\u3000"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-class-gencat32"
+pattern = '\p{Space_Separator}'
+input = "\u205F"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-class-gencat33"
+pattern = '\p{Spacing_Mark}'
+input = "\U00016F7E"
+matches = [[0, 4]]
+
+[[tests]]
+name = "unicode-class-gencat34"
+pattern = '\p{Symbol}'
+input = "⯈"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-class-gencat35"
+pattern = '\p{Titlecase_Letter}'
+input = "ῼ"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-class-gencat36"
+pattern = '\p{Unassigned}'
+input = "\U0010FFFF"
+matches = [[0, 4]]
+
+[[tests]]
+name = "unicode-class-gencat37"
+pattern = '\p{Uppercase_Letter}'
+input = "Ꝋ"
+matches = [[0, 3]]
+
+
+[[tests]]
+name = "unicode-class-emoji1"
+pattern = '\p{Emoji}'
+input = "\u23E9"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-class-emoji2"
+pattern = '\p{emoji}'
+input = "\U0001F21A"
+matches = [[0, 4]]
+
+[[tests]]
+name = "unicode-class-emoji3"
+pattern = '\p{extendedpictographic}'
+input = "\U0001FA6E"
+matches = [[0, 4]]
+
+[[tests]]
+name = "unicode-class-emoji4"
+pattern = '\p{extendedpictographic}'
+input = "\U0001FFFD"
+matches = [[0, 4]]
+
+
+[[tests]]
+name = "unicode-class-gcb1"
+pattern = '\p{grapheme_cluster_break=prepend}'
+input = "\U00011D46"
+matches = [[0, 4]]
+
+[[tests]]
+name = "unicode-class-gcb2"
+pattern = '\p{gcb=regional_indicator}'
+input = "\U0001F1E6"
+matches = [[0, 4]]
+
+[[tests]]
+name = "unicode-class-gcb3"
+pattern = '\p{gcb=ri}'
+input = "\U0001F1E7"
+matches = [[0, 4]]
+
+[[tests]]
+name = "unicode-class-gcb4"
+pattern = '\p{regionalindicator}'
+input = "\U0001F1FF"
+matches = [[0, 4]]
+
+[[tests]]
+name = "unicode-class-gcb5"
+pattern = '\p{gcb=lvt}'
+input = "\uC989"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-class-gcb6"
+pattern = '\p{gcb=zwj}'
+input = "\u200D"
+matches = [[0, 3]]
+
+
+[[tests]]
+name = "unicode-class-word-break1"
+pattern = '\p{word_break=Hebrew_Letter}'
+input = "\uFB46"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-class-word-break2"
+pattern = '\p{wb=hebrewletter}'
+input = "\uFB46"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-class-word-break3"
+pattern = '\p{wb=ExtendNumLet}'
+input = "\uFF3F"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-class-word-break4"
+pattern = '\p{wb=WSegSpace}'
+input = "\u3000"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-class-word-break5"
+pattern = '\p{wb=numeric}'
+input = "\U0001E950"
+matches = [[0, 4]]
+
+
+[[tests]]
+name = "unicode-class-sentence-break1"
+pattern = '\p{sentence_break=Lower}'
+input = "\u0469"
+matches = [[0, 2]]
+
+[[tests]]
+name = "unicode-class-sentence-break2"
+pattern = '\p{sb=lower}'
+input = "\u0469"
+matches = [[0, 2]]
+
+[[tests]]
+name = "unicode-class-sentence-break3"
+pattern = '\p{sb=Close}'
+input = "\uFF60"
+matches = [[0, 3]]
+
+[[tests]]
+name = "unicode-class-sentence-break4"
+pattern = '\p{sb=Close}'
+input = "\U0001F677"
+matches = [[0, 4]]
+
+[[tests]]
+name = "unicode-class-sentence-break5"
+pattern = '\p{sb=SContinue}'
+input = "\uFF64"
+matches = [[0, 3]]