1c67d6573Sopenharmony_cimat!(ascii_literal, r"a", "a", Some((0, 1)));
2c67d6573Sopenharmony_ci
3c67d6573Sopenharmony_ci// Some crazy expressions from regular-expressions.info.
4c67d6573Sopenharmony_cimat!(
5c67d6573Sopenharmony_ci    match_ranges,
6c67d6573Sopenharmony_ci    r"(?-u)\b(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b",
7c67d6573Sopenharmony_ci    "num: 255",
8c67d6573Sopenharmony_ci    Some((5, 8))
9c67d6573Sopenharmony_ci);
10c67d6573Sopenharmony_cimat!(
11c67d6573Sopenharmony_ci    match_ranges_not,
12c67d6573Sopenharmony_ci    r"(?-u)\b(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b",
13c67d6573Sopenharmony_ci    "num: 256",
14c67d6573Sopenharmony_ci    None
15c67d6573Sopenharmony_ci);
16c67d6573Sopenharmony_cimat!(match_float1, r"[-+]?[0-9]*\.?[0-9]+", "0.1", Some((0, 3)));
17c67d6573Sopenharmony_cimat!(match_float2, r"[-+]?[0-9]*\.?[0-9]+", "0.1.2", Some((0, 3)));
18c67d6573Sopenharmony_cimat!(match_float3, r"[-+]?[0-9]*\.?[0-9]+", "a1.2", Some((1, 4)));
19c67d6573Sopenharmony_cimat!(match_float4, r"^[-+]?[0-9]*\.?[0-9]+$", "1.a", None);
20c67d6573Sopenharmony_cimat!(
21c67d6573Sopenharmony_ci    match_email,
22c67d6573Sopenharmony_ci    r"(?i-u)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b",
23c67d6573Sopenharmony_ci    "mine is jam.slam@gmail.com ",
24c67d6573Sopenharmony_ci    Some((8, 26))
25c67d6573Sopenharmony_ci);
26c67d6573Sopenharmony_cimat!(
27c67d6573Sopenharmony_ci    match_email_not,
28c67d6573Sopenharmony_ci    r"(?i-u)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b",
29c67d6573Sopenharmony_ci    "mine is jam.slam@gmail ",
30c67d6573Sopenharmony_ci    None
31c67d6573Sopenharmony_ci);
32c67d6573Sopenharmony_cimat!(
33c67d6573Sopenharmony_ci    match_email_big,
34c67d6573Sopenharmony_ci    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])?",
35c67d6573Sopenharmony_ci    "mine is jam.slam@gmail.com ",
36c67d6573Sopenharmony_ci    Some((8, 26))
37c67d6573Sopenharmony_ci);
38c67d6573Sopenharmony_cimat!(
39c67d6573Sopenharmony_ci    match_date1,
40c67d6573Sopenharmony_ci    r"(?-u)^(19|20)\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])$",
41c67d6573Sopenharmony_ci    "1900-01-01",
42c67d6573Sopenharmony_ci    Some((0, 10))
43c67d6573Sopenharmony_ci);
44c67d6573Sopenharmony_cimat!(
45c67d6573Sopenharmony_ci    match_date2,
46c67d6573Sopenharmony_ci    r"(?-u)^(19|20)\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])$",
47c67d6573Sopenharmony_ci    "1900-00-01",
48c67d6573Sopenharmony_ci    None
49c67d6573Sopenharmony_ci);
50c67d6573Sopenharmony_cimat!(
51c67d6573Sopenharmony_ci    match_date3,
52c67d6573Sopenharmony_ci    r"(?-u)^(19|20)\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])$",
53c67d6573Sopenharmony_ci    "1900-13-01",
54c67d6573Sopenharmony_ci    None
55c67d6573Sopenharmony_ci);
56c67d6573Sopenharmony_ci
57c67d6573Sopenharmony_ci// Do some crazy dancing with the start/end assertions.
58c67d6573Sopenharmony_cimatiter!(match_start_end_empty, r"^$", "", (0, 0));
59c67d6573Sopenharmony_cimatiter!(match_start_end_empty_many_1, r"^$^$^$", "", (0, 0));
60c67d6573Sopenharmony_cimatiter!(match_start_end_empty_many_2, r"^^^$$$", "", (0, 0));
61c67d6573Sopenharmony_cimatiter!(match_start_end_empty_rev, r"$^", "", (0, 0));
62c67d6573Sopenharmony_cimatiter!(
63c67d6573Sopenharmony_ci    match_start_end_empty_rep,
64c67d6573Sopenharmony_ci    r"(?:^$)*",
65c67d6573Sopenharmony_ci    "a\nb\nc",
66c67d6573Sopenharmony_ci    (0, 0),
67c67d6573Sopenharmony_ci    (1, 1),
68c67d6573Sopenharmony_ci    (2, 2),
69c67d6573Sopenharmony_ci    (3, 3),
70c67d6573Sopenharmony_ci    (4, 4),
71c67d6573Sopenharmony_ci    (5, 5)
72c67d6573Sopenharmony_ci);
73c67d6573Sopenharmony_cimatiter!(
74c67d6573Sopenharmony_ci    match_start_end_empty_rep_rev,
75c67d6573Sopenharmony_ci    r"(?:$^)*",
76c67d6573Sopenharmony_ci    "a\nb\nc",
77c67d6573Sopenharmony_ci    (0, 0),
78c67d6573Sopenharmony_ci    (1, 1),
79c67d6573Sopenharmony_ci    (2, 2),
80c67d6573Sopenharmony_ci    (3, 3),
81c67d6573Sopenharmony_ci    (4, 4),
82c67d6573Sopenharmony_ci    (5, 5)
83c67d6573Sopenharmony_ci);
84c67d6573Sopenharmony_ci
85c67d6573Sopenharmony_ci// Test negated character classes.
86c67d6573Sopenharmony_cimat!(negclass_letters, r"[^ac]", "acx", Some((2, 3)));
87c67d6573Sopenharmony_cimat!(negclass_letter_comma, r"[^a,]", "a,x", Some((2, 3)));
88c67d6573Sopenharmony_cimat!(negclass_letter_space, r"[^a[:space:]]", "a x", Some((2, 3)));
89c67d6573Sopenharmony_cimat!(negclass_comma, r"[^,]", ",,x", Some((2, 3)));
90c67d6573Sopenharmony_cimat!(negclass_space, r"[^[:space:]]", " a", Some((1, 2)));
91c67d6573Sopenharmony_cimat!(negclass_space_comma, r"[^,[:space:]]", ", a", Some((2, 3)));
92c67d6573Sopenharmony_cimat!(negclass_comma_space, r"[^[:space:],]", " ,a", Some((2, 3)));
93c67d6573Sopenharmony_cimat!(negclass_ascii, r"[^[:alpha:]Z]", "A1", Some((1, 2)));
94c67d6573Sopenharmony_ci
95c67d6573Sopenharmony_ci// Test that repeated empty expressions don't loop forever.
96c67d6573Sopenharmony_cimat!(lazy_many_many, r"((?:.*)*?)=", "a=b", Some((0, 2)));
97c67d6573Sopenharmony_cimat!(lazy_many_optional, r"((?:.?)*?)=", "a=b", Some((0, 2)));
98c67d6573Sopenharmony_cimat!(lazy_one_many_many, r"((?:.*)+?)=", "a=b", Some((0, 2)));
99c67d6573Sopenharmony_cimat!(lazy_one_many_optional, r"((?:.?)+?)=", "a=b", Some((0, 2)));
100c67d6573Sopenharmony_cimat!(lazy_range_min_many, r"((?:.*){1,}?)=", "a=b", Some((0, 2)));
101c67d6573Sopenharmony_cimat!(lazy_range_many, r"((?:.*){1,2}?)=", "a=b", Some((0, 2)));
102c67d6573Sopenharmony_cimat!(greedy_many_many, r"((?:.*)*)=", "a=b", Some((0, 2)));
103c67d6573Sopenharmony_cimat!(greedy_many_optional, r"((?:.?)*)=", "a=b", Some((0, 2)));
104c67d6573Sopenharmony_cimat!(greedy_one_many_many, r"((?:.*)+)=", "a=b", Some((0, 2)));
105c67d6573Sopenharmony_cimat!(greedy_one_many_optional, r"((?:.?)+)=", "a=b", Some((0, 2)));
106c67d6573Sopenharmony_cimat!(greedy_range_min_many, r"((?:.*){1,})=", "a=b", Some((0, 2)));
107c67d6573Sopenharmony_cimat!(greedy_range_many, r"((?:.*){1,2})=", "a=b", Some((0, 2)));
108c67d6573Sopenharmony_ci
109c67d6573Sopenharmony_ci// Test that we handle various flavors of empty expressions.
110c67d6573Sopenharmony_cimatiter!(match_empty1, r"", "", (0, 0));
111c67d6573Sopenharmony_cimatiter!(match_empty2, r"", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
112c67d6573Sopenharmony_cimatiter!(match_empty3, r"()", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
113c67d6573Sopenharmony_cimatiter!(match_empty4, r"()*", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
114c67d6573Sopenharmony_cimatiter!(match_empty5, r"()+", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
115c67d6573Sopenharmony_cimatiter!(match_empty6, r"()?", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
116c67d6573Sopenharmony_cimatiter!(match_empty7, r"()()", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
117c67d6573Sopenharmony_cimatiter!(match_empty8, r"()+|z", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
118c67d6573Sopenharmony_cimatiter!(match_empty9, r"z|()+", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
119c67d6573Sopenharmony_cimatiter!(match_empty10, r"()+|b", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
120c67d6573Sopenharmony_cimatiter!(match_empty11, r"b|()+", "abc", (0, 0), (1, 2), (3, 3));
121c67d6573Sopenharmony_cimatiter!(match_empty12, r"|b", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
122c67d6573Sopenharmony_cimatiter!(match_empty13, r"b|", "abc", (0, 0), (1, 2), (3, 3));
123c67d6573Sopenharmony_cimatiter!(match_empty14, r"|z", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
124c67d6573Sopenharmony_cimatiter!(match_empty15, r"z|", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
125c67d6573Sopenharmony_cimatiter!(match_empty16, r"|", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
126c67d6573Sopenharmony_cimatiter!(match_empty17, r"||", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
127c67d6573Sopenharmony_cimatiter!(match_empty18, r"||z", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
128c67d6573Sopenharmony_cimatiter!(match_empty19, r"(?:)|b", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
129c67d6573Sopenharmony_cimatiter!(match_empty20, r"b|(?:)", "abc", (0, 0), (1, 2), (3, 3));
130c67d6573Sopenharmony_cimatiter!(match_empty21, r"(?:|)", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
131c67d6573Sopenharmony_cimatiter!(match_empty22, r"(?:|)|z", "abc", (0, 0), (1, 1), (2, 2), (3, 3));
132c67d6573Sopenharmony_cimatiter!(match_empty23, r"a(?:)|b", "abc", (0, 1), (1, 2));
133c67d6573Sopenharmony_ci
134c67d6573Sopenharmony_ci// Test that the DFA can handle pathological cases.
135c67d6573Sopenharmony_ci// (This should result in the DFA's cache being flushed too frequently, which
136c67d6573Sopenharmony_ci// should cause it to quit and fall back to the NFA algorithm.)
137c67d6573Sopenharmony_ci#[test]
138c67d6573Sopenharmony_cifn dfa_handles_pathological_case() {
139c67d6573Sopenharmony_ci    fn ones_and_zeroes(count: usize) -> String {
140c67d6573Sopenharmony_ci        use rand::rngs::SmallRng;
141c67d6573Sopenharmony_ci        use rand::{Rng, SeedableRng};
142c67d6573Sopenharmony_ci
143c67d6573Sopenharmony_ci        let mut rng = SmallRng::from_entropy();
144c67d6573Sopenharmony_ci        let mut s = String::new();
145c67d6573Sopenharmony_ci        for _ in 0..count {
146c67d6573Sopenharmony_ci            if rng.gen() {
147c67d6573Sopenharmony_ci                s.push('1');
148c67d6573Sopenharmony_ci            } else {
149c67d6573Sopenharmony_ci                s.push('0');
150c67d6573Sopenharmony_ci            }
151c67d6573Sopenharmony_ci        }
152c67d6573Sopenharmony_ci        s
153c67d6573Sopenharmony_ci    }
154c67d6573Sopenharmony_ci
155c67d6573Sopenharmony_ci    let re = regex!(r"[01]*1[01]{20}$");
156c67d6573Sopenharmony_ci    let text = {
157c67d6573Sopenharmony_ci        let mut pieces = ones_and_zeroes(100_000);
158c67d6573Sopenharmony_ci        pieces.push('1');
159c67d6573Sopenharmony_ci        pieces.push_str(&ones_and_zeroes(20));
160c67d6573Sopenharmony_ci        pieces
161c67d6573Sopenharmony_ci    };
162c67d6573Sopenharmony_ci    assert!(re.is_match(text!(&*text)));
163c67d6573Sopenharmony_ci}
164c67d6573Sopenharmony_ci
165c67d6573Sopenharmony_ci#[test]
166c67d6573Sopenharmony_cifn nest_limit_makes_it_parse() {
167c67d6573Sopenharmony_ci    use regex::RegexBuilder;
168c67d6573Sopenharmony_ci
169c67d6573Sopenharmony_ci    RegexBuilder::new(
170c67d6573Sopenharmony_ci        r#"(?-u)
171c67d6573Sopenharmony_ci        2(?:
172c67d6573Sopenharmony_ci          [45]\d{3}|
173c67d6573Sopenharmony_ci          7(?:
174c67d6573Sopenharmony_ci            1[0-267]|
175c67d6573Sopenharmony_ci            2[0-289]|
176c67d6573Sopenharmony_ci            3[0-29]|
177c67d6573Sopenharmony_ci            4[01]|
178c67d6573Sopenharmony_ci            5[1-3]|
179c67d6573Sopenharmony_ci            6[013]|
180c67d6573Sopenharmony_ci            7[0178]|
181c67d6573Sopenharmony_ci            91
182c67d6573Sopenharmony_ci          )|
183c67d6573Sopenharmony_ci          8(?:
184c67d6573Sopenharmony_ci            0[125]|
185c67d6573Sopenharmony_ci            [139][1-6]|
186c67d6573Sopenharmony_ci            2[0157-9]|
187c67d6573Sopenharmony_ci            41|
188c67d6573Sopenharmony_ci            6[1-35]|
189c67d6573Sopenharmony_ci            7[1-5]|
190c67d6573Sopenharmony_ci            8[1-8]|
191c67d6573Sopenharmony_ci            90
192c67d6573Sopenharmony_ci          )|
193c67d6573Sopenharmony_ci          9(?:
194c67d6573Sopenharmony_ci            0[0-2]|
195c67d6573Sopenharmony_ci            1[0-4]|
196c67d6573Sopenharmony_ci            2[568]|
197c67d6573Sopenharmony_ci            3[3-6]|
198c67d6573Sopenharmony_ci            5[5-7]|
199c67d6573Sopenharmony_ci            6[0167]|
200c67d6573Sopenharmony_ci            7[15]|
201c67d6573Sopenharmony_ci            8[0146-9]
202c67d6573Sopenharmony_ci          )
203c67d6573Sopenharmony_ci        )\d{4}|
204c67d6573Sopenharmony_ci        3(?:
205c67d6573Sopenharmony_ci          12?[5-7]\d{2}|
206c67d6573Sopenharmony_ci          0(?:
207c67d6573Sopenharmony_ci            2(?:
208c67d6573Sopenharmony_ci              [025-79]\d|
209c67d6573Sopenharmony_ci              [348]\d{1,2}
210c67d6573Sopenharmony_ci            )|
211c67d6573Sopenharmony_ci            3(?:
212c67d6573Sopenharmony_ci              [2-4]\d|
213c67d6573Sopenharmony_ci              [56]\d?
214c67d6573Sopenharmony_ci            )
215c67d6573Sopenharmony_ci          )|
216c67d6573Sopenharmony_ci          2(?:
217c67d6573Sopenharmony_ci            1\d{2}|
218c67d6573Sopenharmony_ci            2(?:
219c67d6573Sopenharmony_ci              [12]\d|
220c67d6573Sopenharmony_ci              [35]\d{1,2}|
221c67d6573Sopenharmony_ci              4\d?
222c67d6573Sopenharmony_ci            )
223c67d6573Sopenharmony_ci          )|
224c67d6573Sopenharmony_ci          3(?:
225c67d6573Sopenharmony_ci            1\d{2}|
226c67d6573Sopenharmony_ci            2(?:
227c67d6573Sopenharmony_ci              [2356]\d|
228c67d6573Sopenharmony_ci              4\d{1,2}
229c67d6573Sopenharmony_ci            )
230c67d6573Sopenharmony_ci          )|
231c67d6573Sopenharmony_ci          4(?:
232c67d6573Sopenharmony_ci            1\d{2}|
233c67d6573Sopenharmony_ci            2(?:
234c67d6573Sopenharmony_ci              2\d{1,2}|
235c67d6573Sopenharmony_ci              [47]|
236c67d6573Sopenharmony_ci              5\d{2}
237c67d6573Sopenharmony_ci            )
238c67d6573Sopenharmony_ci          )|
239c67d6573Sopenharmony_ci          5(?:
240c67d6573Sopenharmony_ci            1\d{2}|
241c67d6573Sopenharmony_ci            29
242c67d6573Sopenharmony_ci          )|
243c67d6573Sopenharmony_ci          [67]1\d{2}|
244c67d6573Sopenharmony_ci          8(?:
245c67d6573Sopenharmony_ci            1\d{2}|
246c67d6573Sopenharmony_ci            2(?:
247c67d6573Sopenharmony_ci              2\d{2}|
248c67d6573Sopenharmony_ci              3|
249c67d6573Sopenharmony_ci              4\d
250c67d6573Sopenharmony_ci            )
251c67d6573Sopenharmony_ci          )
252c67d6573Sopenharmony_ci        )\d{3}|
253c67d6573Sopenharmony_ci        4(?:
254c67d6573Sopenharmony_ci          0(?:
255c67d6573Sopenharmony_ci            2(?:
256c67d6573Sopenharmony_ci              [09]\d|
257c67d6573Sopenharmony_ci              7
258c67d6573Sopenharmony_ci            )|
259c67d6573Sopenharmony_ci            33\d{2}
260c67d6573Sopenharmony_ci          )|
261c67d6573Sopenharmony_ci          1\d{3}|
262c67d6573Sopenharmony_ci          2(?:
263c67d6573Sopenharmony_ci            1\d{2}|
264c67d6573Sopenharmony_ci            2(?:
265c67d6573Sopenharmony_ci              [25]\d?|
266c67d6573Sopenharmony_ci              [348]\d|
267c67d6573Sopenharmony_ci              [67]\d{1,2}
268c67d6573Sopenharmony_ci            )
269c67d6573Sopenharmony_ci          )|
270c67d6573Sopenharmony_ci          3(?:
271c67d6573Sopenharmony_ci            1\d{2}(?:
272c67d6573Sopenharmony_ci              \d{2}
273c67d6573Sopenharmony_ci            )?|
274c67d6573Sopenharmony_ci            2(?:
275c67d6573Sopenharmony_ci              [045]\d|
276c67d6573Sopenharmony_ci              [236-9]\d{1,2}
277c67d6573Sopenharmony_ci            )|
278c67d6573Sopenharmony_ci            32\d{2}
279c67d6573Sopenharmony_ci          )|
280c67d6573Sopenharmony_ci          4(?:
281c67d6573Sopenharmony_ci            [18]\d{2}|
282c67d6573Sopenharmony_ci            2(?:
283c67d6573Sopenharmony_ci              [2-46]\d{2}|
284c67d6573Sopenharmony_ci              3
285c67d6573Sopenharmony_ci            )|
286c67d6573Sopenharmony_ci            5[25]\d{2}
287c67d6573Sopenharmony_ci          )|
288c67d6573Sopenharmony_ci          5(?:
289c67d6573Sopenharmony_ci            1\d{2}|
290c67d6573Sopenharmony_ci            2(?:
291c67d6573Sopenharmony_ci              3\d|
292c67d6573Sopenharmony_ci              5
293c67d6573Sopenharmony_ci            )
294c67d6573Sopenharmony_ci          )|
295c67d6573Sopenharmony_ci          6(?:
296c67d6573Sopenharmony_ci            [18]\d{2}|
297c67d6573Sopenharmony_ci            2(?:
298c67d6573Sopenharmony_ci              3(?:
299c67d6573Sopenharmony_ci                \d{2}
300c67d6573Sopenharmony_ci              )?|
301c67d6573Sopenharmony_ci              [46]\d{1,2}|
302c67d6573Sopenharmony_ci              5\d{2}|
303c67d6573Sopenharmony_ci              7\d
304c67d6573Sopenharmony_ci            )|
305c67d6573Sopenharmony_ci            5(?:
306c67d6573Sopenharmony_ci              3\d?|
307c67d6573Sopenharmony_ci              4\d|
308c67d6573Sopenharmony_ci              [57]\d{1,2}|
309c67d6573Sopenharmony_ci              6\d{2}|
310c67d6573Sopenharmony_ci              8
311c67d6573Sopenharmony_ci            )
312c67d6573Sopenharmony_ci          )|
313c67d6573Sopenharmony_ci          71\d{2}|
314c67d6573Sopenharmony_ci          8(?:
315c67d6573Sopenharmony_ci            [18]\d{2}|
316c67d6573Sopenharmony_ci            23\d{2}|
317c67d6573Sopenharmony_ci            54\d{2}
318c67d6573Sopenharmony_ci          )|
319c67d6573Sopenharmony_ci          9(?:
320c67d6573Sopenharmony_ci            [18]\d{2}|
321c67d6573Sopenharmony_ci            2[2-5]\d{2}|
322c67d6573Sopenharmony_ci            53\d{1,2}
323c67d6573Sopenharmony_ci          )
324c67d6573Sopenharmony_ci        )\d{3}|
325c67d6573Sopenharmony_ci        5(?:
326c67d6573Sopenharmony_ci          02[03489]\d{2}|
327c67d6573Sopenharmony_ci          1\d{2}|
328c67d6573Sopenharmony_ci          2(?:
329c67d6573Sopenharmony_ci            1\d{2}|
330c67d6573Sopenharmony_ci            2(?:
331c67d6573Sopenharmony_ci              2(?:
332c67d6573Sopenharmony_ci                \d{2}
333c67d6573Sopenharmony_ci              )?|
334c67d6573Sopenharmony_ci              [457]\d{2}
335c67d6573Sopenharmony_ci            )
336c67d6573Sopenharmony_ci          )|
337c67d6573Sopenharmony_ci          3(?:
338c67d6573Sopenharmony_ci            1\d{2}|
339c67d6573Sopenharmony_ci            2(?:
340c67d6573Sopenharmony_ci              [37](?:
341c67d6573Sopenharmony_ci                \d{2}
342c67d6573Sopenharmony_ci              )?|
343c67d6573Sopenharmony_ci              [569]\d{2}
344c67d6573Sopenharmony_ci            )
345c67d6573Sopenharmony_ci          )|
346c67d6573Sopenharmony_ci          4(?:
347c67d6573Sopenharmony_ci            1\d{2}|
348c67d6573Sopenharmony_ci            2[46]\d{2}
349c67d6573Sopenharmony_ci          )|
350c67d6573Sopenharmony_ci          5(?:
351c67d6573Sopenharmony_ci            1\d{2}|
352c67d6573Sopenharmony_ci            26\d{1,2}
353c67d6573Sopenharmony_ci          )|
354c67d6573Sopenharmony_ci          6(?:
355c67d6573Sopenharmony_ci            [18]\d{2}|
356c67d6573Sopenharmony_ci            2|
357c67d6573Sopenharmony_ci            53\d{2}
358c67d6573Sopenharmony_ci          )|
359c67d6573Sopenharmony_ci          7(?:
360c67d6573Sopenharmony_ci            1|
361c67d6573Sopenharmony_ci            24
362c67d6573Sopenharmony_ci          )\d{2}|
363c67d6573Sopenharmony_ci          8(?:
364c67d6573Sopenharmony_ci            1|
365c67d6573Sopenharmony_ci            26
366c67d6573Sopenharmony_ci          )\d{2}|
367c67d6573Sopenharmony_ci          91\d{2}
368c67d6573Sopenharmony_ci        )\d{3}|
369c67d6573Sopenharmony_ci        6(?:
370c67d6573Sopenharmony_ci          0(?:
371c67d6573Sopenharmony_ci            1\d{2}|
372c67d6573Sopenharmony_ci            2(?:
373c67d6573Sopenharmony_ci              3\d{2}|
374c67d6573Sopenharmony_ci              4\d{1,2}
375c67d6573Sopenharmony_ci            )
376c67d6573Sopenharmony_ci          )|
377c67d6573Sopenharmony_ci          2(?:
378c67d6573Sopenharmony_ci            2[2-5]\d{2}|
379c67d6573Sopenharmony_ci            5(?:
380c67d6573Sopenharmony_ci              [3-5]\d{2}|
381c67d6573Sopenharmony_ci              7
382c67d6573Sopenharmony_ci            )|
383c67d6573Sopenharmony_ci            8\d{2}
384c67d6573Sopenharmony_ci          )|
385c67d6573Sopenharmony_ci          3(?:
386c67d6573Sopenharmony_ci            1|
387c67d6573Sopenharmony_ci            2[3478]
388c67d6573Sopenharmony_ci          )\d{2}|
389c67d6573Sopenharmony_ci          4(?:
390c67d6573Sopenharmony_ci            1|
391c67d6573Sopenharmony_ci            2[34]
392c67d6573Sopenharmony_ci          )\d{2}|
393c67d6573Sopenharmony_ci          5(?:
394c67d6573Sopenharmony_ci            1|
395c67d6573Sopenharmony_ci            2[47]
396c67d6573Sopenharmony_ci          )\d{2}|
397c67d6573Sopenharmony_ci          6(?:
398c67d6573Sopenharmony_ci            [18]\d{2}|
399c67d6573Sopenharmony_ci            6(?:
400c67d6573Sopenharmony_ci              2(?:
401c67d6573Sopenharmony_ci                2\d|
402c67d6573Sopenharmony_ci                [34]\d{2}
403c67d6573Sopenharmony_ci              )|
404c67d6573Sopenharmony_ci              5(?:
405c67d6573Sopenharmony_ci                [24]\d{2}|
406c67d6573Sopenharmony_ci                3\d|
407c67d6573Sopenharmony_ci                5\d{1,2}
408c67d6573Sopenharmony_ci              )
409c67d6573Sopenharmony_ci            )
410c67d6573Sopenharmony_ci          )|
411c67d6573Sopenharmony_ci          72[2-5]\d{2}|
412c67d6573Sopenharmony_ci          8(?:
413c67d6573Sopenharmony_ci            1\d{2}|
414c67d6573Sopenharmony_ci            2[2-5]\d{2}
415c67d6573Sopenharmony_ci          )|
416c67d6573Sopenharmony_ci          9(?:
417c67d6573Sopenharmony_ci            1\d{2}|
418c67d6573Sopenharmony_ci            2[2-6]\d{2}
419c67d6573Sopenharmony_ci          )
420c67d6573Sopenharmony_ci        )\d{3}|
421c67d6573Sopenharmony_ci        7(?:
422c67d6573Sopenharmony_ci          (?:
423c67d6573Sopenharmony_ci            02|
424c67d6573Sopenharmony_ci            [3-589]1|
425c67d6573Sopenharmony_ci            6[12]|
426c67d6573Sopenharmony_ci            72[24]
427c67d6573Sopenharmony_ci          )\d{2}|
428c67d6573Sopenharmony_ci          21\d{3}|
429c67d6573Sopenharmony_ci          32
430c67d6573Sopenharmony_ci        )\d{3}|
431c67d6573Sopenharmony_ci        8(?:
432c67d6573Sopenharmony_ci          (?:
433c67d6573Sopenharmony_ci            4[12]|
434c67d6573Sopenharmony_ci            [5-7]2|
435c67d6573Sopenharmony_ci            1\d?
436c67d6573Sopenharmony_ci          )|
437c67d6573Sopenharmony_ci          (?:
438c67d6573Sopenharmony_ci            0|
439c67d6573Sopenharmony_ci            3[12]|
440c67d6573Sopenharmony_ci            [5-7]1|
441c67d6573Sopenharmony_ci            217
442c67d6573Sopenharmony_ci          )\d
443c67d6573Sopenharmony_ci        )\d{4}|
444c67d6573Sopenharmony_ci        9(?:
445c67d6573Sopenharmony_ci          [35]1|
446c67d6573Sopenharmony_ci          (?:
447c67d6573Sopenharmony_ci            [024]2|
448c67d6573Sopenharmony_ci            81
449c67d6573Sopenharmony_ci          )\d|
450c67d6573Sopenharmony_ci          (?:
451c67d6573Sopenharmony_ci            1|
452c67d6573Sopenharmony_ci            [24]1
453c67d6573Sopenharmony_ci          )\d{2}
454c67d6573Sopenharmony_ci        )\d{3}
455c67d6573Sopenharmony_ci        "#,
456c67d6573Sopenharmony_ci    )
457c67d6573Sopenharmony_ci    .build()
458c67d6573Sopenharmony_ci    .unwrap();
459c67d6573Sopenharmony_ci}
460