Если вы похожи на меня, то вам нравятся вещи, которые просто работают. Например, когда ты планируешь быть где-то ровно в 8 утра, садишься за руль и чудесным образом приезжаешь ровно в 8 утра. Такие вещи. Уфф…

Итак, представьте мое удивление, когда я обнаружил, что каким-то образом со всей цифровой финансовой системой, которая существовала некоторое время и в последний год резко выросла из-за криптовалют, по-видимому, никто не придумал творческий и элегантный способ проверить международную валюту. Номера банковских счетов, короткие IBAN. И я имею в виду самый элегантный способ проверки конкретной подстроки в тексте: регулярные выражения, regex для краткости.

Краткие сведения: что такое IBAN и что такое регулярные выражения? (регулярные выражения, регулярные выражения, регулярные выражения? Я не знаю. Дайте мне знать, что вы думаете!) Система номеров международных банковских счетов — это согласованный на международном уровне способ уникальной идентификации банковских счетов за границей. У вас есть счет в банке? Тогда у вас есть IBAN. И вы единственный на планете с таким IBAN. Чувствуете себя особенным? Нет? Итак, эта комбинация букв и цифр не только уникальна, но и многое говорит вам о вашем банковском счете. Например, где находится ваш банк, что это за банк вообще и некоторые другие вещи, которые вам не важны.

Кстати, не все страны имеют одинаковое количество цифр в IBAN. Я уверен, что в конечном итоге это не станет супер раздражающим фактором.

В любом случае, регулярные выражения — одна из лучших вещей в программировании. Если вы знаете, как будет «выглядеть» строка символов, то вы сможете найти ее в любом месте этой строки. Скажем, вам нужны фамилии всех названных людей в тексте, который называется «Мистер». Смит», «Мисс. Мейер», «Миссис. Шульц» или «Доктор. Никлауса (кстати, моего отца). Затем вы просто определите группу без захвата (начинающуюся с «?:»), чтобы идентифицировать титул человека следующим образом:

(?:Мистер|Мисс|Миссис|Доктор) [a-zA-Z]*

Обратите внимание на «|»? Что логический оператор ИЛИ говорит «один из этих». Затем следует пробел и любое количество символов * из набора символов для всех букв верхнего и нижнего регистра [a-zA-Z]. Сделанный!

Вот как это работает. Нет проблем, верно? Ну, вы можете найти разницу между этими IBAN?

DE121234123412341234, FR14 2004 1010 0505 0001 3M02 606

Правильно, они все разные по двум параметрам. Мало того, что они явно идентифицируют два очень разных банковских счета в Германии и Франции соответственно. Они также имеют разный формат. Первый находится в удобном для чтения компьютером информационном формате, а второй имеет пробелы, чтобы люди могли идентифицировать группы символов и лучше читать его. Таким образом, один шаг должен состоять в том, чтобы разделить символы на несколько групп с возможными начальными пробелами. Вместо того, чтобы просто сделать это: DE\d{20}, чтобы сказать, что это DE с 20 следующими десятичными числами, вам нужно сделать это: DE\d{2}(?: ?\ г{4}){4}. Это позволяет использовать дополнительный пробел после каждой группы из 4 символов.

Вот так (немного отформатировано):

/(?:IT|SM)\d{2} ?[A-Z]\d{3}(?: ?\d{4}){4} ?\d{3}|
CY\d{2} ?[A-Z]\d{3}(?: ?\d{4}){5}|
NL\d{2} ?[A-Z]{4}(?: ?\d{4}){2} ?\d{2}|
LV\d{2} ?[A-Z]{4}(?: ?\d{4}){3} ?\d|
(?:BG|BH|GB|IE)\d{2} ?[A-Z]{4}(?: ?\d{4}){3} ?\d{2}|
GI\d{2} ?[A-Z]{4}(?: ?\d{4}){3} ?\d{3}|
RO\d{2} ?[A-Z]{4}(?: ?\d{4}){4}|
KW\d{2} ?[A-Z]{4}(?: ?\d{4}){5} ?\d{2}|
MT\d{2} ?[A-Z]{4}(?: ?\d{4}){5} ?\d{3}|
NO\d{2}(?: ?\d{4}){4}|
(?:DK|FI|GL|FO)\d{2}(?: ?\d{4}){3} ?\d{2}|
MK\d{2}(?: ?\d{4}){3} ?\d{3}|
(?:AT|EE|KZ|LU|XK)\d{2}(?: ?\d{4}){4}|
(?:BA|HR|LI|CH|CR)\d{2}(?: ?\d{4}){4} ?\d|
(?:GE|DE|LT|ME|RS)\d{2}(?: ?\d{4}){4} ?\d{2}|
IL\d{2}(?: ?\d{4}){4} ?\d{3}|
(?:AD|CZ|ES|MD|SA)\d{2}(?: ?\d{4}){5}|
PT\d{2}(?: ?\d{4}){5} ?\d|
(?:BE|IS)\d{2}(?: ?\d{4}){5} ?\d{2}|
(?:FR|MR|MC)\d{2}(?: ?\d{4}){5} ?\d{3}|
(?:AL|DO|LB|PL)\d{2}(?: ?\d{4}){6}|
(?:AZ|HU)\d{2}(?: ?\d{4}){6} ?\d|
(?:GR|MU)\d{2}(?: ?\d{4}){6} ?\d{2}/g

Вы можете протестировать регулярное выражение с вашим IBAN здесь.

Как видите, это намного сложнее и дольше, чем можно было бы ожидать. Это связано с разной структурой форматов IBAN по странам. Я говорил тебе, что в конце концов это станет очень раздражающим. Вот почему такой бардак.

Я сделал все возможное, чтобы захватить все возможные форматы IBAN и соответствующие читаемые форматы печати с интервалом, но дайте мне знать, если я что-то пропустил.

Пока :)