Просто для примера IBAN из этих стран:
Начните с 2 букв, затем 2 цифр.
Затем оставьте пробел перед каждыми 4 цифрами, по желанию заканчивая 1 или 2 цифрами:
\b[A-Z]{2}[0-9]{2}(?:[ ]?[0-9]{4}){4}(?!(?:[ ]?[0-9]){3})(?:[ ]?[0-9]{1,2})?\b
тестируйте regex101 здесь
Обратите внимание, что если вы хотите проверить всю строку, регулярное выражение можно упростить.
Поскольку отрицательный прогноз (?!...)
тогда не понадобится.
И границы слов \b
можно заменить началом ^
и конец $
строки.
^[A-Z]{2}[0-9]{2}(?:[ ]?[0-9]{4}){4}(?:[ ]?[0-9]{1,2})?$
Кроме того, это можно упростить еще больше, если наличие 4 групп по 4 соединенных цифры не имеет значения.
^[A-Z]{2}(?:[ ]?[0-9]){18,20}$
Примечания
Но если вы хотите сопоставить номер IBAN со всего мира?
Тогда часть IBAN BBAN может содержать до 30 цифр или букв верхнего регистра. Справочник
И может быть написан либо с пробелами, либо с дефисами, либо без пробелов.
Например: CC12 XXXX 12XX 1234 1234 1234 1234 1234 123
Таким образом, регулярное выражение для сопоставления строки с длинным IBAN станет немного длиннее.
^([A-Z]{2}[ \-]?[0-9]{2})(?=(?:[ \-]?[A-Z0-9]){9,30}$)((?:[ \-]?[A-Z0-9]{3,5}){2,7})([ \-]?[A-Z0-9]{1,3})?$
тестируйте regex101 здесь
Также обратите внимание, что чистое регулярное выражение не может выполнять вычисления.
Таким образом, для фактической проверки номера IBAN требуется дополнительный код.
Пример фрагмента кода Javascript:
function smellsLikeIban(str){
return /^([A-Z]{2}[ \-]?[0-9]{2})(?=(?:[ \-]?[A-Z0-9]){9,30}$)((?:[ \-]?[A-Z0-9]{3,5}){2,7})([ \-]?[A-Z0-9]{1,3})?$/.test(str);
}
function validateIbanChecksum(iban) {
const ibanStripped = iban.replace(/[^A-Z0-9]+/gi,'') //keep numbers and letters only
.toUpperCase(); //calculation expects upper-case
const m = ibanStripped.match(/^([A-Z]{2})([0-9]{2})([A-Z0-9]{9,30})$/);
if(!m) return false;
const numbericed = (m[3] + m[1] + m[2]).replace(/[A-Z]/g,function(ch){
//replace upper-case characters by numbers 10 to 35
return (ch.charCodeAt(0)-55);
});
//The resulting number would be to long for javascript to handle without loosing precision.
//So the trick is to chop the string up in smaller parts.
const mod97 = numbericed.match(/\d{1,7}/g)
.reduce(function(total, curr){ return Number(total + curr)%97},'');
return (mod97 === 1);
};
var arr = [
'DE89 3704 0044 0532 0130 00', // ok
'AT61 1904 3002 3457 3201', // ok
'FR14 2004 1010 0505 0001 3', // wrong checksum
'GB82-WEST-1234-5698-7654-32', // ok
'NL20INGB0001234567', // ok
'XX00 1234 5678 9012 3456 7890 1234 5678 90', // smells ok
'YY00123456789012345678901234567890', // smells ok
'NL20-ING-B0-00-12-34-567', // wrong format, but valid checksum
'XX22YYY1234567890123', // wrong checksum
'[email protected]' // Not even smells like IBAN
];
arr.forEach(function (str) {
console.log('['+ str +'] Smells Like IBAN: '+ smellsLikeIban(str));
console.log('['+ str +'] Valid IBAN Checksum: '+ validateIbanChecksum(str))
});
person
LukStorms
schedule
20.06.2017
DE\d{2}\s*\d{4}\s*\d{4}\s*\d{4}\s*\d{4}\s*\d{2}
будет соответствовать вашему первому примеру. - person Hannon Queiroz   schedule 21.12.2018[A-Z0-9]
2) сопоставил шаблон[A-Z]{2}[0-9]{2}[A-Z0-9]{1,30}
3) проверил контрольную сумму. Кроме того, вы можете проверить длину (зависит от страны), но в большинстве случаев это не требуется, если вы не хотите исключить, что кто-то составил IBAN, пересчитав контрольную сумму. - person A.P.   schedule 27.11.2019/(?<![A-Z])[A-Z]{2}(\h|\-)?[0-9]{2}(\h|\-)?[A-Z0-9](?:(\h|\-)?[A-Z0-9]){10,29}(?![A-Z0-9])/
- person cottton   schedule 23.07.2021