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