1 mat
!(ascii_literal
, r
"a", "a", Some((0, 1)));
3 // Some crazy expressions from regular-expressions.info.
6 r
"(?-u)\b(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b",
12 r
"(?-u)\b(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b",
16 mat
!(match_float1
, r
"[-+]?[0-9]*\.?[0-9]+", "0.1", Some((0, 3)));
17 mat
!(match_float2
, r
"[-+]?[0-9]*\.?[0-9]+", "0.1.2", Some((0, 3)));
18 mat
!(match_float3
, r
"[-+]?[0-9]*\.?[0-9]+", "a1.2", Some((1, 4)));
19 mat
!(match_float4
, r
"^[-+]?[0-9]*\.?[0-9]+$", "1.a", None
);
22 r
"(?i-u)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b",
23 "mine is jam.slam@gmail.com ",
28 r
"(?i-u)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b",
29 "mine is jam.slam@gmail ",
34 r
"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?",
35 "mine is jam.slam@gmail.com ",
40 r
"(?-u)^(19|20)\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])$",
46 r
"(?-u)^(19|20)\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])$",
52 r
"(?-u)^(19|20)\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])$",
57 // Do some crazy dancing with the start/end assertions.
58 matiter
!(match_start_end_empty
, r
"^$", "", (0, 0));
59 matiter
!(match_start_end_empty_many_1
, r
"^$^$^$", "", (0, 0));
60 matiter
!(match_start_end_empty_many_2
, r
"^^^$$$", "", (0, 0));
61 matiter
!(match_start_end_empty_rev
, r
"$^", "", (0, 0));
63 match_start_end_empty_rep
,
74 match_start_end_empty_rep_rev
,
85 // Test negated character classes.
86 mat
!(negclass_letters
, r
"[^ac]", "acx", Some((2, 3)));
87 mat
!(negclass_letter_comma
, r
"[^a,]", "a,x", Some((2, 3)));
88 mat
!(negclass_letter_space
, r
"[^a[:space:]]", "a x", Some((2, 3)));
89 mat
!(negclass_comma
, r
"[^,]", ",,x", Some((2, 3)));
90 mat
!(negclass_space
, r
"[^[:space:]]", " a", Some((1, 2)));
91 mat
!(negclass_space_comma
, r
"[^,[:space:]]", ", a", Some((2, 3)));
92 mat
!(negclass_comma_space
, r
"[^[:space:],]", " ,a", Some((2, 3)));
93 mat
!(negclass_ascii
, r
"[^[:alpha:]Z]", "A1", Some((1, 2)));
95 // Test that repeated empty expressions don't loop forever.
96 mat
!(lazy_many_many
, r
"((?:.*)*?)=", "a=b", Some((0, 2)));
97 mat
!(lazy_many_optional
, r
"((?:.?)*?)=", "a=b", Some((0, 2)));
98 mat
!(lazy_one_many_many
, r
"((?:.*)+?)=", "a=b", Some((0, 2)));
99 mat
!(lazy_one_many_optional
, r
"((?:.?)+?)=", "a=b", Some((0, 2)));
100 mat
!(lazy_range_min_many
, r
"((?:.*){1,}?)=", "a=b", Some((0, 2)));
101 mat
!(lazy_range_many
, r
"((?:.*){1,2}?)=", "a=b", Some((0, 2)));
102 mat
!(greedy_many_many
, r
"((?:.*)*)=", "a=b", Some((0, 2)));
103 mat
!(greedy_many_optional
, r
"((?:.?)*)=", "a=b", Some((0, 2)));
104 mat
!(greedy_one_many_many
, r
"((?:.*)+)=", "a=b", Some((0, 2)));
105 mat
!(greedy_one_many_optional
, r
"((?:.?)+)=", "a=b", Some((0, 2)));
106 mat
!(greedy_range_min_many
, r
"((?:.*){1,})=", "a=b", Some((0, 2)));
107 mat
!(greedy_range_many
, r
"((?:.*){1,2})=", "a=b", Some((0, 2)));
109 // Test that we handle various flavors of empty expressions.
110 matiter
!(match_empty1
, r
"", "", (0, 0));
111 matiter
!(match_empty2
, r
"", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
112 matiter
!(match_empty3
, r
"()", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
113 matiter
!(match_empty4
, r
"()*", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
114 matiter
!(match_empty5
, r
"()+", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
115 matiter
!(match_empty6
, r
"()?", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
116 matiter
!(match_empty7
, r
"()()", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
117 matiter
!(match_empty8
, r
"()+|z", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
118 matiter
!(match_empty9
, r
"z|()+", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
119 matiter
!(match_empty10
, r
"()+|b", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
120 matiter
!(match_empty11
, r
"b|()+", "abc", (0, 0), (1, 2), (3, 3));
121 matiter
!(match_empty12
, r
"|b", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
122 matiter
!(match_empty13
, r
"b|", "abc", (0, 0), (1, 2), (3, 3));
123 matiter
!(match_empty14
, r
"|z", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
124 matiter
!(match_empty15
, r
"z|", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
125 matiter
!(match_empty16
, r
"|", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
126 matiter
!(match_empty17
, r
"||", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
127 matiter
!(match_empty18
, r
"||z", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
128 matiter
!(match_empty19
, r
"(?:)|b", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
129 matiter
!(match_empty20
, r
"b|(?:)", "abc", (0, 0), (1, 2), (3, 3));
130 matiter
!(match_empty21
, r
"(?:|)", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
131 matiter
!(match_empty22
, r
"(?:|)|z", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
132 matiter
!(match_empty23
, r
"a(?:)|b", "abc", (0, 1), (1, 2));
134 // Test that the DFA can handle pathological cases.
135 // (This should result in the DFA's cache being flushed too frequently, which
136 // should cause it to quit and fall back to the NFA algorithm.)
138 fn dfa_handles_pathological_case() {
139 fn ones_and_zeroes(count
: usize) -> String
{
140 use rand
::rngs
::SmallRng
;
141 use rand
::{Rng, SeedableRng}
;
143 let mut rng
= SmallRng
::from_entropy();
144 let mut s
= String
::new();
155 let re
= regex
!(r
"[01]*1[01]{20}$");
157 let mut pieces
= ones_and_zeroes(100_000);
159 pieces
.push_str(&ones_and_zeroes(20));
162 assert
!(re
.is_match(text
!(&*text
)));
166 fn nest_limit_makes_it_parse() {
167 use regex
::RegexBuilder
;