Регулярное выражение для IBAN, позволяющее использовать пробелы И проверять точную длину

Мне нужно проверить поле ввода для немецкого IBAN. Пользователю должно быть разрешено оставлять пробелы, и ввод должен быть проверен на наличие начального DE, а затем точных 20-символьных цифр и букв.

Без учета пробелов я попытался

^[DE]{2}([0-9a-zA-Z]{20})$

но я не могу найти, где и как я могу добавить «пробелы везде, где разрешено».

Это должно быть просто, но я просто не могу найти решение.

Спасибо за помощь!


person viddity    schedule 05.05.2014    source источник
comment
Какой язык вы используете? Является ли удаление всех пробелов из строки подходящим решением? Кроме того, к вашему сведению, [DE]{2} соответствует DD или ED: см. regular-expressions.info/charclass.html   -  person Robin    schedule 05.05.2014
comment
как я говорю в своем ответе, вы используете не тот инструмент для этой задачи. Вы не должны проверять что-то столь важное, как IBAN, на соответствие формату, а проверять действительность всего кода, вычисляя контрольную сумму, что агорифмически так же сложно, как проверка регулярных выражений.   -  person zmo    schedule 05.05.2014
comment
Большое спасибо! мы правильно проверяем правильный формат IBAN в бэкэнде, но также хотим направлять пользователя в интерфейсе.   -  person viddity    schedule 05.05.2014
comment
не стремитесь просто направлять, просто подтверждайте это. Повторюсь: вычисление контрольной суммы быстрее, легче и проще, чем регулярное выражение, и это лучший способ проверить ввод IBAN!   -  person zmo    schedule 08.05.2014


Ответы (7)


Потому что вы должны использовать правильный инструмент для правильной задачи: вы не должны полагаться на регулярные выражения для проверки номеров IBAN, а вместо этого использовать алгоритм контрольной суммы IBAN для проверки правильности всего кода, что делает любые регулярные выражения излишними. и избыточный. то есть: удалить все пробелы, изменить код, преобразовать в целые числа и вычислить остаток, здесь лучше всего объяснил.

Хотя я пытаюсь ответить на ваш вопрос, ради удовольствия:

как насчет:

^DE([0-9a-zA-Z]\s?){20}$

единственная разница заключается в том, что после каждого появления буквенно-цифрового символа допускается пробел (или нет).

здесь визуализация:

Визуализация регулярных выражений

изменить: для информации ОП, единственное отличие состоит в том, что это регулярное выражение от @ulugbex-umirov: (?:\s*[0-9a-zA-Z]\s*) выполняет предварительную проверку, чтобы увидеть, есть ли пробел между кодом страны iso и контрольной суммой (которая состоит только из числовых цифр), что Специально не поддерживаю.

И на самом деле для поддержки правильного синтаксиса IBAN, который состоит из групп из 4 символов, как сказано на странице википедии:

^DE\d{2}\s?([0-9a-zA-Z]{4}\s?){4}[0-9a-zA-Z]{2}$

Визуализация регулярных выражений

пример

Если ваш пользовательский интерфейс написан на Javascript, вы можете использовать эту библиотеку для проверки IBAN:

<script src="iban.js"></script>
<script>
    // the API is now accessible from the window.IBAN global object
    IBAN.isValid('hello world'); // false
    IBAN.isValid('BE68539007547034'); // true
</script>

так что вы знаете, что это действительный IBAN, и можете проверить его еще до того, как данные будут отправлены на сервер. Проще, легче и элегантнее… Зачем делать что-то еще?

person zmo    schedule 05.05.2014
comment
Хорошо, что не нужно полагаться на регулярные выражения для проверки IBAN, но я думаю, что регулярное выражение можно использовать во внешнем интерфейсе, чтобы обнаруживать любые очевидные ошибки и направлять пользователя. Я бы сделал более серьезную проверку IBAN в бэкэнде. - person Jezen Thomas; 05.05.2014
comment
Большое спасибо за быстрый и очень полезный ответ! мы также проверяем в бэкэнде. регулярное выражение является дополнительным, для руководства пользователя - person viddity; 05.05.2014
comment
нет, вы ошибаетесь, проверка контрольной суммы действительно легкая, если не легче, чем проверка регулярных выражений! И это позволило бы помочь пользователю обнаружить любую реальную ошибку, а не просто ошибки формата, ошибки формата часто являются проблемой. Кроме того, вы можете поддерживать любую контрольную сумму, а не только немецкую… и я был клиентом многих немецких сайтов, которые принимают платежи только из немецкоязычных стран, в то время как я не живу в один из тех… Мы в Европе, у нас есть SEPA и IBAN! :-) - person zmo; 05.05.2014
comment
Кстати, если ваш пользовательский интерфейс написан на javascript, есть куча библиотек JS: здесь, здесь или там, что мешает подсчету контрольной суммы. - person zmo; 05.05.2014
comment
Я столкнулся с этим вопросом специально, потому что мне нужно было решить ошибку, из-за которой номер национального счета в старом стиле по чистой случайности соответствовал алгоритму контрольной суммы и, таким образом, проходил как IBAN. Поэтому я решил добавить проверку регулярных выражений. Лучшее решение: сделать и то, и другое. - person fbitterlich; 26.08.2014
comment
@fbitterlich вы где-нибудь публиковали подробную информацию об этой ошибке? Я не вижу в этом проблемы на странице arhs/iban.js github. - person kluka; 07.01.2015
comment
@klyonrad Чтобы уточнить: ошибка, которую я упомянул, была в моем собственном (неопубликованном) коде. Добавление двойной проверки (контрольная сумма и регулярное выражение) позволяет мне более надежно различать IBAN и номера счетов в старом стиле. - person fbitterlich; 08.01.2015
comment
@zmo: Этот ответ заставляет меня хотеть иметь возможность дважды проголосовать :-) - person Andresch Serj; 21.10.2015
comment
Спасибо, рад что помог :-) - person zmo; 22.10.2015
comment
Для этого даже существует библиотека Python. - person MertTheGreat; 03.06.2020

Вот список IBAN из 70 стран. Я сгенерировал его с помощью скрипта Python, написанного на основе этого https://en.wikipedia.org/wiki/International_Bank_Account_Number

AL[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){2}([a-zA-Z0-9]{4}\s?){4}\s?
AD[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){2}([a-zA-Z0-9]{4}\s?){3}\s?
AT[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){4}\s?
AZ[a-zA-Z0-9]{2}\s?([a-zA-Z0-9]{4}\s?){1}([0-9]{4}\s?){5}\s?
BH[a-zA-Z0-9]{2}\s?([a-zA-Z]{4}\s?){1}([a-zA-Z0-9]{4}\s?){3}([a-zA-Z0-9]{2})\s?
BY[a-zA-Z0-9]{2}\s?([a-zA-Z0-9]{4}\s?){1}([0-9]{4}\s?){5}\s?
BE[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){3}\s?
BA[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){4}\s?
BR[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){5}([0-9]{3})([a-zA-Z]{1}\s?)([a-zA-Z0-9]{1})\s?
BG[a-zA-Z0-9]{2}\s?([a-zA-Z]{4}\s?){1}([0-9]{4}\s?){1}([0-9]{2})([a-zA-Z0-9]{2}\s?)([a-zA-Z0-9]{4}\s?){1}([a-zA-Z0-9]{2})\s?
CR[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){4}([0-9]{2})\s?
HR[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){4}([0-9]{1})\s?
CY[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){2}([a-zA-Z0-9]{4}\s?){4}\s?
CZ[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){5}\s?
DK[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){3}([0-9]{2})\s?
DO[a-zA-Z0-9]{2}\s?([a-zA-Z]{4}\s?){1}([0-9]{4}\s?){5}\s?
TL[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){4}([0-9]{3})\s?
EE[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){4}\s?
FO[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){3}([0-9]{2})\s?
FI[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){3}([0-9]{2})\s?
FR[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){2}([0-9]{2})([a-zA-Z0-9]{2}\s?)([a-zA-Z0-9]{4}\s?){2}([a-zA-Z0-9]{1})([0-9]{2})\s?
GE[a-zA-Z0-9]{2}\s?([a-zA-Z0-9]{2})([0-9]{2}\s?)([0-9]{4}\s?){3}([0-9]{2})\s?
DE[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){4}([0-9]{2})\s?
GI[a-zA-Z0-9]{2}\s?([a-zA-Z]{4}\s?){1}([a-zA-Z0-9]{4}\s?){3}([a-zA-Z0-9]{3})\s?
GR[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){1}([0-9]{3})([a-zA-Z0-9]{1}\s?)([a-zA-Z0-9]{4}\s?){3}([a-zA-Z0-9]{3})\s?
GL[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){3}([0-9]{2})\s?
GT[a-zA-Z0-9]{2}\s?([a-zA-Z0-9]{4}\s?){1}([a-zA-Z0-9]{4}\s?){5}\s?
HU[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){6}\s?
IS[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){5}([0-9]{2})\s?
IE[a-zA-Z0-9]{2}\s?([a-zA-Z0-9]{4}\s?){1}([0-9]{4}\s?){3}([0-9]{2})\s?
IL[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){4}([0-9]{3})\s?
IT[a-zA-Z0-9]{2}\s?([a-zA-Z]{1})([0-9]{3}\s?)([0-9]{4}\s?){1}([0-9]{3})([a-zA-Z0-9]{1}\s?)([a-zA-Z0-9]{4}\s?){2}([a-zA-Z0-9]{3})\s?
JO[a-zA-Z0-9]{2}\s?([a-zA-Z]{4}\s?){1}([0-9]{4}\s?){5}([0-9]{2})\s?
KZ[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){3}([0-9]{1})([a-zA-Z0-9]{3}\s?)([a-zA-Z0-9]{4}\s?){2}([a-zA-Z0-9]{2})\s?
XK[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){1}([0-9]{4}\s?){2}([0-9]{2})([0-9]{2}\s?)\s?
KW[a-zA-Z0-9]{2}\s?([a-zA-Z]{4}\s?){1}([a-zA-Z0-9]{4}\s?){5}([a-zA-Z0-9]{2})\s?
LV[a-zA-Z0-9]{2}\s?([a-zA-Z]{4}\s?){1}([a-zA-Z0-9]{4}\s?){3}([a-zA-Z0-9]{1})\s?
LB[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){1}([a-zA-Z0-9]{4}\s?){5}\s?
LI[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){1}([0-9]{1})([a-zA-Z0-9]{3}\s?)([a-zA-Z0-9]{4}\s?){2}([a-zA-Z0-9]{1})\s?
LT[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){4}\s?
LU[a-zA-Z0-9]{2}\s?([0-9]{3})([a-zA-Z0-9]{1}\s?)([a-zA-Z0-9]{4}\s?){3}\s?
MK[a-zA-Z0-9]{2}\s?([0-9]{3})([a-zA-Z0-9]{1}\s?)([a-zA-Z0-9]{4}\s?){2}([a-zA-Z0-9]{1})([0-9]{2})\s?
MT[a-zA-Z0-9]{2}\s?([a-zA-Z]{4}\s?){1}([0-9]{4}\s?){1}([0-9]{1})([a-zA-Z0-9]{3}\s?)([a-zA-Z0-9]{4}\s?){3}([a-zA-Z0-9]{3})\s?
MR[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){5}([0-9]{3})\s?
MU[a-zA-Z0-9]{2}\s?([a-zA-Z]{4}\s?){1}([0-9]{4}\s?){4}([0-9]{3})([a-zA-Z]{1}\s?)([a-zA-Z]{2})\s?
MC[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){2}([0-9]{2})([a-zA-Z0-9]{2}\s?)([a-zA-Z0-9]{4}\s?){2}([a-zA-Z0-9]{1})([0-9]{2})\s?
MD[a-zA-Z0-9]{2}\s?([a-zA-Z0-9]{2})([a-zA-Z0-9]{2}\s?)([a-zA-Z0-9]{4}\s?){4}\s?
ME[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){4}([0-9]{2})\s?
NL[a-zA-Z0-9]{2}\s?([a-zA-Z]{4}\s?){1}([0-9]{4}\s?){2}([0-9]{2})\s?
NO[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){2}([0-9]{3})\s?
PK[a-zA-Z0-9]{2}\s?([a-zA-Z0-9]{4}\s?){1}([0-9]{4}\s?){4}\s?
PS[a-zA-Z0-9]{2}\s?([a-zA-Z0-9]{4}\s?){1}([0-9]{4}\s?){5}([0-9]{1})\s?
PL[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){6}\s?
PT[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){5}([0-9]{1})\s?
QA[a-zA-Z0-9]{2}\s?([a-zA-Z]{4}\s?){1}([a-zA-Z0-9]{4}\s?){5}([a-zA-Z0-9]{1})\s?
RO[a-zA-Z0-9]{2}\s?([a-zA-Z]{4}\s?){1}([a-zA-Z0-9]{4}\s?){4}\s?
SM[a-zA-Z0-9]{2}\s?([a-zA-Z]{1})([0-9]{3}\s?)([0-9]{4}\s?){1}([0-9]{3})([a-zA-Z0-9]{1}\s?)([a-zA-Z0-9]{4}\s?){2}([a-zA-Z0-9]{3})\s?
SA[a-zA-Z0-9]{2}\s?([0-9]{2})([a-zA-Z0-9]{2}\s?)([a-zA-Z0-9]{4}\s?){4}\s?
RS[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){4}([0-9]{2})\s?
SK[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){5}\s?
SI[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){3}([0-9]{3})\s?
ES[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){5}\s?
SE[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){5}\s?
CH[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){1}([0-9]{1})([a-zA-Z0-9]{3}\s?)([a-zA-Z0-9]{4}\s?){2}([a-zA-Z0-9]{1})\s?
TN[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){5}\s?
TR[a-zA-Z0-9]{2}\s?([0-9]{4}\s?){1}([0-9]{1})([a-zA-Z0-9]{3}\s?)([a-zA-Z0-9]{4}\s?){3}([a-zA-Z0-9]{2})\s?
AE[a-zA-Z0-9]{2}\s?([0-9]{3})([0-9]{1}\s?)([0-9]{4}\s?){3}([0-9]{3})\s?
GB[a-zA-Z0-9]{2}\s?([a-zA-Z]{4}\s?){1}([0-9]{4}\s?){3}([0-9]{2})\s?
VA[a-zA-Z0-9]{2}\s?([0-9]{3})([0-9]{1}\s?)([0-9]{4}\s?){3}([0-9]{2})\s?
VG[a-zA-Z0-9]{2}\s?([a-zA-Z0-9]{4}\s?){1}([0-9]{4}\s?){4}\s? 
person Pascal Zoleko    schedule 17.07.2019
comment
Не знаю, почему минусы. Этот список, по крайней мере, невероятно полезен. Эти кажутся правильными. И немецкое регулярное выражение находится в вашем ответе. - person Bob van den Berg; 25.10.2019

Оригинал:

^[DE]{2}([0-9a-zA-Z]{20})$

Визуализация регулярных выражений

Демонстрация отладки

Изменено:

^DE(?:\s*[0-9a-zA-Z]\s*){20}$

Визуализация регулярных выражений

Демонстрация отладки

person Ulugbek Umirov    schedule 05.05.2014

Это правильное регулярное выражение для соответствия номерам счетов DE IBAN:

DE\d{2}[ ]\d{4}[ ]\d{4}[ ]\d{4}[ ]\d{4}[ ]\d{2}|DE\d{20}

Pass:   DE89 3704 0044 0532 0130 00|||DE89370400440532013000
Fail:   DE89-3704-0044-0532-0130-00
person Pedro Lobito    schedule 05.05.2014

Самое простое решение, о котором я могу думать:

^DE(\s*[[:alnum:]]){20}\s*$

В частности, ваш первоначальный [DE]{2} неверен, поскольку он допускает «DD», «EE», «ED», а также предполагаемый «DE».

person Jongware    schedule 05.05.2014

Чтобы разрешить любое количество пробелов в любом месте:

^ *D *E( *[A-Za-z0-9]){20} *$

Поскольку вы хотите разрешить строчные буквы, также DE может быть ниже?

^ *[Dd] *[Ee]( *[A-Za-z0-9]){20} *$
  • ^ соответствует началу строки
  • $ концевой анкер
  • между каждым символом есть необязательные пробелы *
  • [класс символов] определяет набор/диапазон символов

Чтобы между символами оставалось не более одного пробела, замените квантификатор * (любое количество из) с ? (0 или 1). Если поддерживается, \s сокращение можно использовать для соответствия [ \t\r\n\f] вместо пробела.

Тест на regex101.com, см. также Часто задаваемые вопросы по регулярным выражениям SO

person Jonny 5    schedule 05.05.2014

Используя скрипт Google Apps, я вставил код Лорана из github в файл script и добавил следующий код для тестирования.

// Use the Apps Script IDE's "Run" menu to execute this code.
// Then look at the View > Logs menu to see execution results.

function myFunction() {
//https://github.com/arhs/iban.js/blob/master/README.md
// var IBAN = require('iban');
var t1 = IBAN.isValid('hello world'); // false
var t2 = IBAN.isValid('BE68539007547034'); // true
var t3 = IBAN.isValid('BE68 5390 0754 7034'); // true

Logger.log("Test 1 = %s", t1);
Logger.log("Test 2 = %s", t2);
Logger.log("Test 3 = %s", t3);
}

Единственное, что нужно было для запуска кода примера, это закомментировать строку require('iban'): // var IBAN = require('iban'); Наконец, вместо того, чтобы использовать клиентские обработчики для проверки RegEx ввода IBAN, я использую серверный обработчик для проверки.

person Steven.AA    schedule 08.08.2014