Skip to content

Commit 2ddbb49

Browse files
Merge pull request #11 from bjufre/fix/regex-module-attr
Fix regexp change in OTP 28 that deprecated regexp module attributes
2 parents 4d5dc1d + 8c01ddb commit 2ddbb49

File tree

2 files changed

+132
-129
lines changed

2 files changed

+132
-129
lines changed

lib/bankster/bic.ex

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ defmodule Bankster.Bic do
1414
branch: binary() | nil
1515
}
1616

17-
@bic_regex ~r/^(?<bank>[a-zA-Z]{4})\s*(?<country>[a-zA-Z]{2})\s*(?<location>[0-9a-zA-Z]{2})\s*(?<branch>[0-9a-zA-Z]{3})?$/
18-
1917
@doc """
2018
Parses a BIC string into its components.
2119
@@ -40,7 +38,7 @@ defmodule Bankster.Bic do
4038
"""
4139
@spec parse(term()) :: {:ok, t()} | :error
4240
def parse(bic) when is_binary(bic) do
43-
case Regex.named_captures(@bic_regex, bic) do
41+
case Regex.named_captures(bic_regex(), bic) do
4442
nil ->
4543
:error
4644

@@ -152,11 +150,15 @@ defmodule Bankster.Bic do
152150
true
153151
"""
154152
@spec valid?(binary()) :: boolean()
155-
def valid?(bic) when is_binary(bic), do: Regex.match?(@bic_regex, bic)
153+
def valid?(bic) when is_binary(bic), do: Regex.match?(bic_regex(), bic)
156154
def valid?(_), do: false
157155

158156
defp presence(""), do: nil
159157
defp presence(val), do: val
158+
159+
defp bic_regex do
160+
~r/^(?<bank>[a-zA-Z]{4})\s*(?<country>[a-zA-Z]{2})\s*(?<location>[0-9a-zA-Z]{2})\s*(?<branch>[0-9a-zA-Z]{3})?$/
161+
end
160162
end
161163

162164
defimpl String.Chars, for: Bankster.Bic do

lib/bankster/iban.ex

Lines changed: 126 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -4,126 +4,6 @@ defmodule Bankster.Iban do
44
"""
55

66
## -- Module constants
7-
# - IBAN Rules
8-
@iban_rules %{
9-
"AA" => %{length: 16, rule: ~r/^[0-9A-Z]{12}$/i},
10-
"AD" => %{length: 24, rule: ~r/^[0-9]{8}[0-9A-Z]{12}$/i},
11-
"AE" => %{length: 23, rule: ~r/^[0-9]{19}$/i},
12-
"AL" => %{length: 28, rule: ~r/^[0-9]{8}[0-9A-Z]{16}$/i},
13-
"AO" => %{length: 25, rule: ~r/^[0-9]{21}$/i},
14-
"AT" => %{length: 20, rule: ~r/^[0-9]{16}$/i},
15-
"AX" => %{length: 18, rule: ~r/^[0-9]{14}$/i},
16-
"AZ" => %{length: 28, rule: ~r/^[A-Z]{4}[0-9A-Z]{20}$/i},
17-
"BA" => %{length: 20, rule: ~r/^[0-9]{16}$/i},
18-
"BE" => %{length: 16, rule: ~r/^[0-9]{12}$/i},
19-
"BF" => %{length: 27, rule: ~r/^[0-9]{23}$/i},
20-
"BG" => %{length: 22, rule: ~r/^[A-Z]{4}[0-9]{6}[0-9A-Z]{8}$/i},
21-
"BH" => %{length: 22, rule: ~r/^[A-Z]{4}[0-9]{14}$/i},
22-
"BI" => %{length: 16, rule: ~r/^[0-9]{12}$/i},
23-
"BJ" => %{length: 28, rule: ~r/^[A-Z]{1}[0-9]{23}$/i},
24-
"BL" => %{length: 27, rule: ~r/^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/i},
25-
"BR" => %{length: 29, rule: ~r/^[0-9]{23}[A-Z]{1}[0-9A-Z]{1}$/i},
26-
"BY" => %{length: 28, rule: ~r/^[0-9A-Z]{4}[0-9]{4}[0-9A-Z]{16}$/i},
27-
"CF" => %{length: 27, rule: ~r/^[0-9]{23}$/i},
28-
"CG" => %{length: 27, rule: ~r/^[0-9]{23}$/i},
29-
"CH" => %{length: 21, rule: ~r/^[0-9]{5}[0-9A-Z]{12}$/i},
30-
"CI" => %{length: 28, rule: ~r/^[A-Z]{1}[0-9]{23}$/i},
31-
"CM" => %{length: 27, rule: ~r/^[0-9]{23}$/i},
32-
"CR" => %{length: 22, rule: ~r/^[0-9]{18}$/i},
33-
"CV" => %{length: 25, rule: ~r/^[0-9]{21}$/i},
34-
"CY" => %{length: 28, rule: ~r/^[0-9]{8}[0-9A-Z]{16}$/i},
35-
"CZ" => %{length: 24, rule: ~r/^[0-9]{20}$/i},
36-
"DE" => %{length: 22, rule: ~r/^[0-9]{18}$/i},
37-
"DJ" => %{length: 27, rule: ~r/^[0-9]{23}$/i},
38-
"DK" => %{length: 18, rule: ~r/^[0-9]{14}$/i},
39-
"DO" => %{length: 28, rule: ~r/^[0-9A-Z]{4}[0-9]{20}$/i},
40-
"DZ" => %{length: 24, rule: ~r/^[0-9]{20}$/i},
41-
"EE" => %{length: 20, rule: ~r/^[0-9]{16}$/i},
42-
"EG" => %{length: 27, rule: ~r/^[0-9]{23}$/i},
43-
"ES" => %{length: 24, rule: ~r/^[0-9]{20}$/i},
44-
"FI" => %{length: 18, rule: ~r/^[0-9]{14}$/i},
45-
"FO" => %{length: 18, rule: ~r/^[0-9]{14}$/i},
46-
"FR" => %{length: 27, rule: ~r/^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/i},
47-
"GA" => %{length: 27, rule: ~r/^[0-9]{23}$/i},
48-
"GB" => %{length: 22, rule: ~r/^[A-Z]{4}[0-9]{14}$/i},
49-
"GE" => %{length: 22, rule: ~r/^[A-Z]{2}[0-9]{16}$/i},
50-
"GF" => %{length: 27, rule: ~r/^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/i},
51-
"GI" => %{length: 23, rule: ~r/^[A-Z]{4}[0-9A-Z]{15}$/i},
52-
"GL" => %{length: 18, rule: ~r/^[0-9]{14}$/i},
53-
"GP" => %{length: 27, rule: ~r/^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/i},
54-
"GQ" => %{length: 27, rule: ~r/^[0-9]{23}$/i},
55-
"GR" => %{length: 27, rule: ~r/^[0-9]{7}[0-9A-Z]{16}$/i},
56-
"GT" => %{length: 28, rule: ~r/^[0-9A-Z]{24}$/i},
57-
"GW" => %{length: 25, rule: ~r/^[0-9A-Z]{2}[0-9]{19}$/i},
58-
"HN" => %{length: 28, rule: ~r/^[A-Z]{4}[0-9]{20}$/i},
59-
"HR" => %{length: 21, rule: ~r/^[0-9]{17}$/i},
60-
"HU" => %{length: 28, rule: ~r/^[0-9]{24}$/i},
61-
"IE" => %{length: 22, rule: ~r/^[A-Z]{4}[0-9]{14}$/i},
62-
"IL" => %{length: 23, rule: ~r/^[0-9]{19}$/i},
63-
"IQ" => %{length: 23, rule: ~r/^[0-9A-Z]{4}[0-9]{15}$/i},
64-
"IR" => %{length: 26, rule: ~r/^[0-9]{22}$/i},
65-
"IS" => %{length: 26, rule: ~r/^[0-9]{22}$/i},
66-
"IT" => %{length: 27, rule: ~r/^[A-Z]{1}[0-9]{10}[0-9A-Z]{12}$/i},
67-
"JO" => %{length: 30, rule: ~r/^[A-Z]{4}[0-9]{4}[0-9A-Z]{18}$/i},
68-
"KM" => %{length: 27, rule: ~r/^[0-9]{23}$/i},
69-
"KW" => %{length: 30, rule: ~r/^[A-Z]{4}[0-9]{22}$/i},
70-
"KZ" => %{length: 20, rule: ~r/^[0-9]{3}[0-9A-Z]{13}$/i},
71-
"LB" => %{length: 28, rule: ~r/^[0-9]{4}[0-9A-Z]{20}$/i},
72-
"LC" => %{length: 32, rule: ~r/^[A-Z]{4}[0-9A-Z]{24}$/i},
73-
"LI" => %{length: 21, rule: ~r/^[0-9]{5}[0-9A-Z]{12}$/i},
74-
"LT" => %{length: 20, rule: ~r/^[0-9]{16}$/i},
75-
"LU" => %{length: 20, rule: ~r/^[0-9]{3}[0-9A-Z]{13}$/i},
76-
"LV" => %{length: 21, rule: ~r/^[A-Z]{4}[0-9A-Z]{13}$/i},
77-
"MA" => %{length: 28, rule: ~r/^[0-9]{24}$/i},
78-
"MC" => %{length: 27, rule: ~r/^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/i},
79-
"MD" => %{length: 24, rule: ~r/^[0-9A-Z]{20}$/i},
80-
"ME" => %{length: 22, rule: ~r/^[0-9]{18}$/i},
81-
"MF" => %{length: 27, rule: ~r/^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/i},
82-
"MG" => %{length: 27, rule: ~r/^[0-9]{23}$/i},
83-
"MK" => %{length: 19, rule: ~r/^[0-9]{3}[0-9A-Z]{10}[0-9]{2}$/i},
84-
"ML" => %{length: 28, rule: ~r/^[A-Z]{1}[0-9]{23}$/i},
85-
"MQ" => %{length: 27, rule: ~r/^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/i},
86-
"MR" => %{length: 27, rule: ~r/^[0-9]{23}$/i},
87-
"MT" => %{length: 31, rule: ~r/^[A-Z]{4}[0-9]{5}[0-9A-Z]{18}$/i},
88-
"MU" => %{length: 30, rule: ~r/^[A-Z]{4}[0-9]{19}[A-Z]{3}$/i},
89-
"MZ" => %{length: 25, rule: ~r/^[0-9]{21}$/i},
90-
"NC" => %{length: 27, rule: ~r/^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/i},
91-
"NE" => %{length: 28, rule: ~r/^[A-Z]{2}[0-9]{22}$/i},
92-
"NI" => %{length: 32, rule: ~r/^[A-Z]{4}[0-9]{24}$/i},
93-
"NL" => %{length: 18, rule: ~r/^[A-Z]{4}[0-9]{10}$/i},
94-
"NO" => %{length: 15, rule: ~r/^[0-9]{11}$/i},
95-
"PF" => %{length: 27, rule: ~r/^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/i},
96-
"PK" => %{length: 24, rule: ~r/^[A-Z]{4}[0-9A-Z]{16}$/i},
97-
"PL" => %{length: 28, rule: ~r/^[0-9]{24}$/i},
98-
"PM" => %{length: 27, rule: ~r/^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/i},
99-
"PS" => %{length: 29, rule: ~r/^[A-Z]{4}[0-9A-Z]{21}$/i},
100-
"PT" => %{length: 25, rule: ~r/^[0-9]{21}$/i},
101-
"QA" => %{length: 29, rule: ~r/^[A-Z]{4}[0-9]{4}[0-9A-Z]{17}$/i},
102-
"RE" => %{length: 27, rule: ~r/^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/i},
103-
"RO" => %{length: 24, rule: ~r/^[A-Z]{4}[0-9A-Z]{16}$/i},
104-
"RS" => %{length: 22, rule: ~r/^[0-9]{18}$/i},
105-
"SA" => %{length: 24, rule: ~r/^[0-9]{2}[0-9A-Z]{18}$/i},
106-
"SC" => %{length: 31, rule: ~r/^[A-Z]{4}[0-9]{20}[A-Z]{3}$/i},
107-
"SE" => %{length: 24, rule: ~r/^[0-9]{20}$/i},
108-
"SI" => %{length: 19, rule: ~r/^[0-9]{15}$/i},
109-
"SK" => %{length: 24, rule: ~r/^[0-9]{20}$/i},
110-
"SM" => %{length: 27, rule: ~r/^[A-Z]{1}[0-9]{10}[0-9A-Z]{12}$/i},
111-
"SN" => %{length: 28, rule: ~r/^[A-Z]{1}[0-9]{23}$/i},
112-
"ST" => %{length: 25, rule: ~r/^[0-9]{8}[0-9]{13}$/i},
113-
"SV" => %{length: 28, rule: ~r/^[0-9A-Z]{4}[0-9]{20}$/i},
114-
"TD" => %{length: 27, rule: ~r/^[0-9]{23}$/i},
115-
"TF" => %{length: 27, rule: ~r/^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/i},
116-
"TG" => %{length: 28, rule: ~r/^[A-Z]{2}[0-9]{22}$/i},
117-
"TL" => %{length: 23, rule: ~r/^[0-9]{19}$/i},
118-
"TN" => %{length: 24, rule: ~r/^[0-9]{20}$/i},
119-
"TR" => %{length: 26, rule: ~r/^[0-9]{6}[0-9A-Z]{16}$/i},
120-
"UA" => %{length: 29, rule: ~r/^[0-9]{6}[0-9A-Z]{19}$/i},
121-
"VG" => %{length: 24, rule: ~r/^[A-Z]{4}[0-9]{16}$/i},
122-
"WF" => %{length: 27, rule: ~r/^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/i},
123-
"XK" => %{length: 20, rule: ~r/^[0-9]{16}$/i},
124-
"YT" => %{length: 27, rule: ~r/^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/i}
125-
}
126-
1277
# - IBAN replacements
1288
@replacements %{
1299
"A" => "10",
@@ -216,7 +96,7 @@ defmodule Bankster.Iban do
21696
["SM", "KZ", "SN", "BA", "GA", "KW", "MU", ...]
21797
"""
21898
@spec supported_countries :: list(binary())
219-
def supported_countries, do: Map.keys(@iban_rules)
99+
def supported_countries, do: Map.keys(iban_rules())
220100

221101
@doc """
222102
Validates whether the given country code is within the supported countries.
@@ -230,7 +110,7 @@ defmodule Bankster.Iban do
230110
"""
231111
@spec supported_country?(binary()) :: boolean()
232112
def supported_country?(country_code) when is_binary(country_code),
233-
do: Map.has_key?(@iban_rules, format_default(country_code))
113+
do: Map.has_key?(iban_rules(), format_default(country_code))
234114

235115
def supported_country?(_country_code),
236116
do: false
@@ -330,17 +210,17 @@ defmodule Bankster.Iban do
330210
# - Check whether a given IBAN violates the supported countries.
331211
@spec iban_violates_country?(binary()) :: boolean
332212
defp iban_violates_country?(iban),
333-
do: !Map.has_key?(@iban_rules, country_code(iban))
213+
do: !Map.has_key?(iban_rules(), country_code(iban))
334214

335215
# - Check whether a given IBAN violates the required length.
336216
@spec iban_violates_length?(binary()) :: boolean
337217
defp iban_violates_length?(iban),
338-
do: size(iban) != get_in(@iban_rules, [country_code(iban), :length])
218+
do: size(iban) != get_in(iban_rules(), [country_code(iban), :length])
339219

340220
# - Check whether a given IBAN violates the country rules.
341221
@spec iban_violates_country_rule?(binary()) :: boolean
342222
defp iban_violates_country_rule?(iban) do
343-
if iban_rule = get_in(@iban_rules, [country_code(iban), :rule]) do
223+
if iban_rule = get_in(iban_rules(), [country_code(iban), :rule]) do
344224
!Regex.match?(iban_rule, String.slice(format_default(iban), 4..-1//1))
345225
else
346226
false
@@ -365,4 +245,125 @@ defmodule Bankster.Iban do
365245

366246
calculated_checksum !== checksum(iban)
367247
end
248+
249+
defp iban_rules do
250+
%{
251+
"AA" => %{length: 16, rule: ~r/^[0-9A-Z]{12}$/i},
252+
"AD" => %{length: 24, rule: ~r/^[0-9]{8}[0-9A-Z]{12}$/i},
253+
"AE" => %{length: 23, rule: ~r/^[0-9]{19}$/i},
254+
"AL" => %{length: 28, rule: ~r/^[0-9]{8}[0-9A-Z]{16}$/i},
255+
"AO" => %{length: 25, rule: ~r/^[0-9]{21}$/i},
256+
"AT" => %{length: 20, rule: ~r/^[0-9]{16}$/i},
257+
"AX" => %{length: 18, rule: ~r/^[0-9]{14}$/i},
258+
"AZ" => %{length: 28, rule: ~r/^[A-Z]{4}[0-9A-Z]{20}$/i},
259+
"BA" => %{length: 20, rule: ~r/^[0-9]{16}$/i},
260+
"BE" => %{length: 16, rule: ~r/^[0-9]{12}$/i},
261+
"BF" => %{length: 27, rule: ~r/^[0-9]{23}$/i},
262+
"BG" => %{length: 22, rule: ~r/^[A-Z]{4}[0-9]{6}[0-9A-Z]{8}$/i},
263+
"BH" => %{length: 22, rule: ~r/^[A-Z]{4}[0-9]{14}$/i},
264+
"BI" => %{length: 16, rule: ~r/^[0-9]{12}$/i},
265+
"BJ" => %{length: 28, rule: ~r/^[A-Z]{1}[0-9]{23}$/i},
266+
"BL" => %{length: 27, rule: ~r/^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/i},
267+
"BR" => %{length: 29, rule: ~r/^[0-9]{23}[A-Z]{1}[0-9A-Z]{1}$/i},
268+
"BY" => %{length: 28, rule: ~r/^[0-9A-Z]{4}[0-9]{4}[0-9A-Z]{16}$/i},
269+
"CF" => %{length: 27, rule: ~r/^[0-9]{23}$/i},
270+
"CG" => %{length: 27, rule: ~r/^[0-9]{23}$/i},
271+
"CH" => %{length: 21, rule: ~r/^[0-9]{5}[0-9A-Z]{12}$/i},
272+
"CI" => %{length: 28, rule: ~r/^[A-Z]{1}[0-9]{23}$/i},
273+
"CM" => %{length: 27, rule: ~r/^[0-9]{23}$/i},
274+
"CR" => %{length: 22, rule: ~r/^[0-9]{18}$/i},
275+
"CV" => %{length: 25, rule: ~r/^[0-9]{21}$/i},
276+
"CY" => %{length: 28, rule: ~r/^[0-9]{8}[0-9A-Z]{16}$/i},
277+
"CZ" => %{length: 24, rule: ~r/^[0-9]{20}$/i},
278+
"DE" => %{length: 22, rule: ~r/^[0-9]{18}$/i},
279+
"DJ" => %{length: 27, rule: ~r/^[0-9]{23}$/i},
280+
"DK" => %{length: 18, rule: ~r/^[0-9]{14}$/i},
281+
"DO" => %{length: 28, rule: ~r/^[0-9A-Z]{4}[0-9]{20}$/i},
282+
"DZ" => %{length: 24, rule: ~r/^[0-9]{20}$/i},
283+
"EE" => %{length: 20, rule: ~r/^[0-9]{16}$/i},
284+
"EG" => %{length: 27, rule: ~r/^[0-9]{23}$/i},
285+
"ES" => %{length: 24, rule: ~r/^[0-9]{20}$/i},
286+
"FI" => %{length: 18, rule: ~r/^[0-9]{14}$/i},
287+
"FO" => %{length: 18, rule: ~r/^[0-9]{14}$/i},
288+
"FR" => %{length: 27, rule: ~r/^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/i},
289+
"GA" => %{length: 27, rule: ~r/^[0-9]{23}$/i},
290+
"GB" => %{length: 22, rule: ~r/^[A-Z]{4}[0-9]{14}$/i},
291+
"GE" => %{length: 22, rule: ~r/^[A-Z]{2}[0-9]{16}$/i},
292+
"GF" => %{length: 27, rule: ~r/^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/i},
293+
"GI" => %{length: 23, rule: ~r/^[A-Z]{4}[0-9A-Z]{15}$/i},
294+
"GL" => %{length: 18, rule: ~r/^[0-9]{14}$/i},
295+
"GP" => %{length: 27, rule: ~r/^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/i},
296+
"GQ" => %{length: 27, rule: ~r/^[0-9]{23}$/i},
297+
"GR" => %{length: 27, rule: ~r/^[0-9]{7}[0-9A-Z]{16}$/i},
298+
"GT" => %{length: 28, rule: ~r/^[0-9A-Z]{24}$/i},
299+
"GW" => %{length: 25, rule: ~r/^[0-9A-Z]{2}[0-9]{19}$/i},
300+
"HN" => %{length: 28, rule: ~r/^[A-Z]{4}[0-9]{20}$/i},
301+
"HR" => %{length: 21, rule: ~r/^[0-9]{17}$/i},
302+
"HU" => %{length: 28, rule: ~r/^[0-9]{24}$/i},
303+
"IE" => %{length: 22, rule: ~r/^[A-Z]{4}[0-9]{14}$/i},
304+
"IL" => %{length: 23, rule: ~r/^[0-9]{19}$/i},
305+
"IQ" => %{length: 23, rule: ~r/^[0-9A-Z]{4}[0-9]{15}$/i},
306+
"IR" => %{length: 26, rule: ~r/^[0-9]{22}$/i},
307+
"IS" => %{length: 26, rule: ~r/^[0-9]{22}$/i},
308+
"IT" => %{length: 27, rule: ~r/^[A-Z]{1}[0-9]{10}[0-9A-Z]{12}$/i},
309+
"JO" => %{length: 30, rule: ~r/^[A-Z]{4}[0-9]{4}[0-9A-Z]{18}$/i},
310+
"KM" => %{length: 27, rule: ~r/^[0-9]{23}$/i},
311+
"KW" => %{length: 30, rule: ~r/^[A-Z]{4}[0-9]{22}$/i},
312+
"KZ" => %{length: 20, rule: ~r/^[0-9]{3}[0-9A-Z]{13}$/i},
313+
"LB" => %{length: 28, rule: ~r/^[0-9]{4}[0-9A-Z]{20}$/i},
314+
"LC" => %{length: 32, rule: ~r/^[A-Z]{4}[0-9A-Z]{24}$/i},
315+
"LI" => %{length: 21, rule: ~r/^[0-9]{5}[0-9A-Z]{12}$/i},
316+
"LT" => %{length: 20, rule: ~r/^[0-9]{16}$/i},
317+
"LU" => %{length: 20, rule: ~r/^[0-9]{3}[0-9A-Z]{13}$/i},
318+
"LV" => %{length: 21, rule: ~r/^[A-Z]{4}[0-9A-Z]{13}$/i},
319+
"MA" => %{length: 28, rule: ~r/^[0-9]{24}$/i},
320+
"MC" => %{length: 27, rule: ~r/^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/i},
321+
"MD" => %{length: 24, rule: ~r/^[0-9A-Z]{20}$/i},
322+
"ME" => %{length: 22, rule: ~r/^[0-9]{18}$/i},
323+
"MF" => %{length: 27, rule: ~r/^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/i},
324+
"MG" => %{length: 27, rule: ~r/^[0-9]{23}$/i},
325+
"MK" => %{length: 19, rule: ~r/^[0-9]{3}[0-9A-Z]{10}[0-9]{2}$/i},
326+
"ML" => %{length: 28, rule: ~r/^[A-Z]{1}[0-9]{23}$/i},
327+
"MQ" => %{length: 27, rule: ~r/^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/i},
328+
"MR" => %{length: 27, rule: ~r/^[0-9]{23}$/i},
329+
"MT" => %{length: 31, rule: ~r/^[A-Z]{4}[0-9]{5}[0-9A-Z]{18}$/i},
330+
"MU" => %{length: 30, rule: ~r/^[A-Z]{4}[0-9]{19}[A-Z]{3}$/i},
331+
"MZ" => %{length: 25, rule: ~r/^[0-9]{21}$/i},
332+
"NC" => %{length: 27, rule: ~r/^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/i},
333+
"NE" => %{length: 28, rule: ~r/^[A-Z]{2}[0-9]{22}$/i},
334+
"NI" => %{length: 32, rule: ~r/^[A-Z]{4}[0-9]{24}$/i},
335+
"NL" => %{length: 18, rule: ~r/^[A-Z]{4}[0-9]{10}$/i},
336+
"NO" => %{length: 15, rule: ~r/^[0-9]{11}$/i},
337+
"PF" => %{length: 27, rule: ~r/^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/i},
338+
"PK" => %{length: 24, rule: ~r/^[A-Z]{4}[0-9A-Z]{16}$/i},
339+
"PL" => %{length: 28, rule: ~r/^[0-9]{24}$/i},
340+
"PM" => %{length: 27, rule: ~r/^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/i},
341+
"PS" => %{length: 29, rule: ~r/^[A-Z]{4}[0-9A-Z]{21}$/i},
342+
"PT" => %{length: 25, rule: ~r/^[0-9]{21}$/i},
343+
"QA" => %{length: 29, rule: ~r/^[A-Z]{4}[0-9]{4}[0-9A-Z]{17}$/i},
344+
"RE" => %{length: 27, rule: ~r/^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/i},
345+
"RO" => %{length: 24, rule: ~r/^[A-Z]{4}[0-9A-Z]{16}$/i},
346+
"RS" => %{length: 22, rule: ~r/^[0-9]{18}$/i},
347+
"SA" => %{length: 24, rule: ~r/^[0-9]{2}[0-9A-Z]{18}$/i},
348+
"SC" => %{length: 31, rule: ~r/^[A-Z]{4}[0-9]{20}[A-Z]{3}$/i},
349+
"SE" => %{length: 24, rule: ~r/^[0-9]{20}$/i},
350+
"SI" => %{length: 19, rule: ~r/^[0-9]{15}$/i},
351+
"SK" => %{length: 24, rule: ~r/^[0-9]{20}$/i},
352+
"SM" => %{length: 27, rule: ~r/^[A-Z]{1}[0-9]{10}[0-9A-Z]{12}$/i},
353+
"SN" => %{length: 28, rule: ~r/^[A-Z]{1}[0-9]{23}$/i},
354+
"ST" => %{length: 25, rule: ~r/^[0-9]{8}[0-9]{13}$/i},
355+
"SV" => %{length: 28, rule: ~r/^[0-9A-Z]{4}[0-9]{20}$/i},
356+
"TD" => %{length: 27, rule: ~r/^[0-9]{23}$/i},
357+
"TF" => %{length: 27, rule: ~r/^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/i},
358+
"TG" => %{length: 28, rule: ~r/^[A-Z]{2}[0-9]{22}$/i},
359+
"TL" => %{length: 23, rule: ~r/^[0-9]{19}$/i},
360+
"TN" => %{length: 24, rule: ~r/^[0-9]{20}$/i},
361+
"TR" => %{length: 26, rule: ~r/^[0-9]{6}[0-9A-Z]{16}$/i},
362+
"UA" => %{length: 29, rule: ~r/^[0-9]{6}[0-9A-Z]{19}$/i},
363+
"VG" => %{length: 24, rule: ~r/^[A-Z]{4}[0-9]{16}$/i},
364+
"WF" => %{length: 27, rule: ~r/^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/i},
365+
"XK" => %{length: 20, rule: ~r/^[0-9]{16}$/i},
366+
"YT" => %{length: 27, rule: ~r/^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/i}
367+
}
368+
end
368369
end

0 commit comments

Comments
 (0)