IBAN 验证检查
Posted
技术标签:
【中文标题】IBAN 验证检查【英文标题】:IBAN Validation check 【发布时间】:2014-03-22 14:13:51 【问题描述】:我需要使用 javascript 进行 。我需要遵守的规则是:
验证 IBAN 通过将 IBAN 转换为整数并对其执行基本的 mod-97 操作(如 ISO 7064 中所述)来验证 IBAN。如果 IBAN 有效,则余数等于 1。
根据国家/地区检查 IBAN 总长度是否正确。如果不是,则 IBAN 无效
将四个初始字符移到字符串的末尾
将字符串中的每个字母替换为两位数,从而扩展字符串,其中 A = 10, B = 11, ..., Z = 35
将字符串解释为十进制整数并计算该数字除以 97 后的余数
我正在为白俄罗斯的 IBAN 执行此操作,因此它必须遵循以下格式
2C 31N -
RU12300000000000000000000000000000
如何修改以下内容以满足上述规则;
function validateIBAN(iban)
var newIban = iban.toUpperCase(),
modulo = function(divident, divisor)
var cDivident = '';
var cRest = '';
for (var i in divident)
var cChar = divident[i];
var cOperator = cRest + '' + cDivident + '' + cChar;
if (cOperator < parseInt(divisor))
cDivident += '' + cChar;
else
cRest = cOperator % divisor;
if (cRest == 0)
cRest = '';
cDivident = '';
cRest += '' + cDivident;
if (cRest == '')
cRest = 0;
return cRest;
;
if (newIban.search(/^[A-Z]2/gi) < 0)
return false;
newIban = newIban.substring(4) + newIban.substring(0, 4);
newIban = newIban.replace(/[A-Z]/g, function(match)
return match.charCodeAt(0) - 55;
);
return parseInt(modulo(newIban, 97), 10) === 1;
console.log(validateIBAN("RU1230000000000000000000000000000"));
【问题讨论】:
【参考方案1】:您可以使用此库来验证和格式化 IBAN:https://github.com/arhs/iban.js(免责声明:我编写了该库)
但是,不支持俄罗斯和白俄罗斯,因为我在 IBAN page of wikipedia 和 official IBAN registry 上都找不到任何提及这些国家的信息,所以恐怕您必须自己修改库代码以添加它。
【讨论】:
此代码无法验证摩尔多瓦 IBAN。例如MD75EX0900002374642125EU
。根据 www.iban.com 它是有效的
谢谢@armen。已打开的问题 (github.com/arhs/iban.js/issues/23) 将很快解决。
非常好的@Laurent VB,修复后有邮件列表通知我吗?
@armen 你可以订阅 github 问题通知。我也会来更新这个 SO 线程。【参考方案2】:
“jquery验证插件”也支持iban check:
https://github.com/jzaefferer/jquery-validation/blob/master/src/additional/iban.js
【讨论】:
【参考方案3】:基于http://toms-cafe.de/iban/iban.js 的工作,我开发了我的IBAN 检查版本。
您可以通过修改变量CODE_LENGTHS
来修改国家支持。
这是我的实现:
function alertValidIBAN(iban)
alert(isValidIBANNumber(iban));
/*
* Returns 1 if the IBAN is valid
* Returns FALSE if the IBAN's length is not as should be (for CY the IBAN Should be 28 chars long starting with CY )
* Returns any other number (checksum) when the IBAN is invalid (check digits do not match)
*/
function isValidIBANNumber(input)
var CODE_LENGTHS =
AD: 24, AE: 23, AT: 20, AZ: 28, BA: 20, BE: 16, BG: 22, BH: 22, BR: 29,
CH: 21, CR: 21, CY: 28, CZ: 24, DE: 22, DK: 18, DO: 28, EE: 20, ES: 24,
FI: 18, FO: 18, FR: 27, GB: 22, GI: 23, GL: 18, GR: 27, GT: 28, HR: 21,
HU: 28, IE: 22, IL: 23, IS: 26, IT: 27, JO: 30, KW: 30, KZ: 20, LB: 28,
LI: 21, LT: 20, LU: 20, LV: 21, MC: 27, MD: 24, ME: 22, MK: 19, MR: 27,
MT: 31, MU: 30, NL: 18, NO: 15, PK: 24, PL: 28, PS: 29, PT: 25, QA: 29,
RO: 24, RS: 22, SA: 24, SE: 24, SI: 19, SK: 24, SM: 27, TN: 24, TR: 26,
AL: 28, BY: 28, CR: 22, EG: 29, GE: 22, IQ: 23, LC: 32, SC: 31, ST: 25,
SV: 28, TL: 23, UA: 29, VA: 22, VG: 24, XK: 20
;
var iban = String(input).toUpperCase().replace(/[^A-Z0-9]/g, ''), // keep only alphanumeric characters
code = iban.match(/^([A-Z]2)(\d2)([A-Z\d]+)$/), // match and capture (1) the country code, (2) the check digits, and (3) the rest
digits;
// check syntax and length
if (!code || iban.length !== CODE_LENGTHS[code[1]])
return false;
// rearrange country code and check digits, and convert chars to ints
digits = (code[3] + code[1] + code[2]).replace(/[A-Z]/g, function (letter)
return letter.charCodeAt(0) - 55;
);
// final check
return mod97(digits);
function mod97(string)
var checksum = string.slice(0, 2), fragment;
for (var offset = 2; offset < string.length; offset += 7)
fragment = String(checksum) + string.substring(offset, offset + 7);
checksum = parseInt(fragment, 10) % 97;
return checksum;
input width:300px;
Enter IBAN
<input type="test" id="iban"/>
<button onclick="alertValidIBAN(null);">check IBAN</button>
【讨论】:
似乎工作得很好。添加了更多国家/地区代码,因为它是一种验证方法,我猜它应该返回布尔值而不是校验和值。所以我也把return改成了return mod97(digits) === 1;
@Ismaestro 不,它返回'55' - > 根据描述'当 IBAN 无效时返回任何其他数字(校验和)'
使用真实帐户检查的片段,运行不正确。使用github.com/arhs/iban.js解决方案
在“CODE_LENGTHS”列表中两次提到“CR”是否正确?见第 2 列和第 3 列。
CR 是 22,而不是 21(假定为哥斯达黎加)【参考方案4】:
根据之前的答案,我创建了一个实现 Angular Validator
方法的 Directive
。
我还添加了类型。
iban-validator.directive.ts
import Validator, AbstractControl, NG_VALIDATORS from '@angular/forms';
import Directive from '@angular/core';
@Directive(
selector: '[ibanValidators]',
providers: [
provide: NG_VALIDATORS,
useExisting: IbanValidatorDirective,
multi: true
]
)
export class IbanValidatorDirective implements Validator
validate(control: AbstractControl): object
const codeLengths =
AD: 24, AE: 23, AL: 28, AT: 20, AZ: 28, BA: 20, BE: 16, BG: 22, BH: 22, BR: 29, CH: 21, CR: 21, CY: 28, CZ: 24,
DE: 22, DK: 18, DO: 28, EE: 20, ES: 24, LC: 30, FI: 18, FO: 18, FR: 27, GB: 22, GI: 23, GL: 18, GR: 27, GT: 28,
HR: 21, HU: 28, IE: 22, IL: 23, IS: 26, IT: 27, JO: 30, KW: 30, KZ: 20, LB: 28, LI: 21, LT: 20, LU: 20, LV: 21,
MC: 27, MD: 24, ME: 22, MK: 19, MR: 27, MT: 31, MU: 30, NL: 18, NO: 15, PK: 24, PL: 28, PS: 29, PT: 25, QA: 29,
RO: 24, RS: 22, SA: 24, SE: 24, SI: 19, SK: 24, SM: 27, TN: 24, TR: 26
;
if (control.value)
const iban = control.value.toUpperCase().replace(/[^A-Z0-9]/g, '');
const code = iban.match(/^([A-Z]2)(\d2)([A-Z\d]+)$/);
let digits: number;
if (!code || iban.length !== codeLengths[code[1]])
return ibanValid: false ;
digits = (code[3] + code[1] + code[2]).replace(/[A-Z]/g, (letter: string) =>
return letter.charCodeAt(0) - 55;
);
return this.mod97(digits) === 1 ? null : ibanValid: false ;
private mod97(digital: number | string)
digital = digital.toString();
let checksum: number | string = digital.slice(0, 2);
let fragment = '';
for (let offset = 2; offset < digital.length; offset += 7)
fragment = checksum + digital.substring(offset, offset + 7);
checksum = parseInt(fragment, 10) % 97;
return checksum;
然后只需在输入上使用指令。
【讨论】:
【参考方案5】:我回答了一个类似的问题。使用此正则表达式列表来验证您的 IBANS。有 70 个国家/地区,所以总的来说你应该很高兴。
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?
【讨论】:
该列表包含 70 个国家/地区的 IBAN 正则表达式。 IBAN 很容易测试。 3 次投反对票是否意味着这些 IBAN 没用? 赞成,因为我发现它很有用,但它似乎根本不正确:我认为在前两个字符之后总是应该跟着 2 位数字。所以而不是例如AL[a-zA-Z0-9]2
应该是AL[0-9]2
对吧!?
哦,非常感谢。你是对的,我的 B。我在 AL IBAN 的测试中添加了“c”而不是“n”,因此根据***:en.wikipedia.org/wiki/International_Bank_Account_Number 它应该是 8n,16c。
要明确一点:它不仅适用于 AL,还会影响所有 IBAN。您引用的***说 IBAN 包含 ob 2 个字母的国家/地区代码,后跟 2 个(校验)数字(始终为数字),然后是最多 30 个特定于国家/地区的字母数字字符。所以第一个块'[a-zA-Z0-9]'应该总是'[0-9]'
赞成,因为我需要一个国家的正则表达式,而不是通用的。【参考方案6】:
我知道这是一个老话题,但由于它在 Google 上排名第一,而且这里的解决方案并没有真正完善,我想向您展示我的看法:
export const validIban = (value) =>
let rearrange =
value.substring(4, value.length)
+ value.substring(0, 4);
let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split('');
let alphaMap = ;
let number = [];
alphabet.forEach((value, index) =>
alphaMap[value] = index + 10;
);
rearrange.split('').forEach((value, index) =>
number[index] = alphaMap[value] || value;
);
return modulo(number.join('').toString(), 97) === 1;
const modulo = (aNumStr, aDiv) =>
var tmp = "";
var i, r;
for (i = 0; i < aNumStr.length; i++)
tmp += aNumStr.charAt(i);
r = tmp % aDiv;
tmp = r.toString();
return tmp / 1;
它对我来说效果很好,你可以用它来测试它
validIban(testThis)
/ http://randomiban.com
【讨论】:
这需要一些重构,不能与'01'、'1'等一起使用。 目前为止最好的解决方案,不需要任何依赖。正是我想要的。谢谢!【参考方案7】:我已经设法创建了以下 RegEx,以便根据当前格式进行快速验证。
/^(?:(?:IT|SM)\d2[A-Z]\d22|NL\d2[A-Z]4\d10|RO\d2[A-Z]4\d[A-Z]\d14|LV\d2[A-Z]4\d13|FR\d19[A-Z]\d5|LI\d17[A-Z]2|MD\d2[A-Z]2\d18|(?:BG|GB|IE)\d2[A-Z]4\d14|BH\d2[A-Z]4\d10[A-Z]2\d2|GE\d2[A-Z]2\d16|GI\d2[A-Z]4\d15|BR\d25[A-Z]\d|MU\d2[A-Z]4\d19[A-Z]3|PS\d2[A-Z]4\d21|QA\d2[A-Z]4\d14[A-Z]7|(?:AZ|DO|GT)\d2[A-Z]4\d20|(?:BJ|ML|SN|CI)\d2[A-Z]\d23|(?:PK|VG)\d2[A-Z]4\d16|(?:KW|JO)\d2[A-Z]4\d22|MT\d2[A-Z]4\d12[A-Z]7\d3[A-Z]|NO\d13|(?:BE|BI)\d14|(?:DK|FI|GL|FO)\d16|(?:MK|SI)\d17|(?:BA|LT|AT|EE|KZ|LU|XK)\d18|(?:HR|CH|CR)\d19|(?:DE|ME|RS)\d20|(?:AE|IL|TL)\d21|(?:AD|CZ|ES|SA|DZ|SK|SE|TN)\d22|(?:PT|AO|CV|MZ)\d23|(?:IS|IR|TR)\d24|(?:MR|MC|BF|CM|GR|MG)\d25|(?:AL|DO|LB|PL|CY|HU)\d26)$/i
【讨论】:
不错,但它不能验证 IBAN。【参考方案8】:根据最新的 SWIFT IBAN Registrar 出版物(2021 年 6 月),here,我更新了 Rony Nasr 的 REGEX 提案。它包括 79 个国家/地区并检查特定国家/地区的 IBAN 结构和长度。 (但是,它不会进行校验和 MOD97 验证)。
/^(?:(?:CR|DE|ME|RS|VA)\d20|(?:CZ|ES|SE|SK|TN)\d22|(?:DK|FI|FO|GL|SD)\d16|(?:AT|BA|EE|LT|XK)\d18|(?:AE|IL|TL)\d21|(?:LY|PT|ST)\d23|(?:IT|SM)\d2[A-Z]\d10[A-Za-z0-9]12|(?:HU|PL)\d26|(?:AL|CY)\d10[A-Za-z0-9]16|(?:CH|LI)\d7[A-Za-z0-9]12|(?:FR|MC)\d12[A-Za-z0-9]11\d2|(?:GB|IE)\d2[A-Z]4\d14|(?:KZ|LU)\d5[A-Za-z0-9]13|(?:GI|IQ)\d2[A-Z]4[A-Za-z0-9]15|(?:PK|RO)\d2[A-Z]4[A-Za-z0-9]16|(?:PS|QA)\d2[A-Z]4[A-Za-z0-9]21|AD\d10[A-Za-z0-9]12|AZ\d2[A-Z]4[A-Za-z0-9]20|BE\d14|BG\d2[A-Z]4\d6[A-Za-z0-9]8|BH\d2[A-Z]4[A-Za-z0-9]14|BR\d25[A-Z][A-Za-z0-9]|BY\d2[A-Za-z0-9]4\d4[A-Za-z0-9]16|DO\d2[A-Za-z0-9]4\d20|EG\d27|GE\d2[A-Z]\d16|GT\d2[A-Za-z0-9]24|GR\d9[A-Za-z0-9]16|HR\d19|IS\d24|JO\d2[A-Z]4\d4[A-Za-z0-9]18|KW\d2[A-Z]4[A-Za-z0-9]22|LC\d2[A-Z]4[A-Za-z0-9]24|LB\d6[A-Za-z0-9]20|LV\d2[A-Z]4\d13|MD\d2[A-Za-z0-9]20|MK\d5[A-Za-z0-9]10\d2|MR\d25|MT\d2[A-Z]4\d5[A-Za-z0-9]18|MU\d2[A-Z]4\d19[A-Z]3|NL\d2[A-Z]4\d10|NO\d13|SA\d4[A-Za-z0-9]18|SC\d2[A-Z]4\d20[A-Z]3|SI\d17|SV\d2[A-Z]4\d20|TR\d8[A-Za-z0-9]16|UA\d8[A-Za-z0-9]19|VG\d2[A-Z]4\d16|GE\d2[A-Z]2\d16)$/gm
【讨论】:
你错过了 GE 国家。【参考方案9】:我写了 2 个正则表达式,第一个适用于仅 SEPA 的国家/地区,另一个适用于所有支持 IBAN 的国家/地区,截至 2021-10。
SEPA 区域内国家/地区的 IBAN 正则表达式
第一个检查 IBAN 在 SEPA 区域内是否有效,IBAN 必须属于 SEPA 区域内的国家/地区。 (它认为 SEPA 区域之外的 IBAN 无效)
^(?:((?:IT|SM)\d2[A-Z]1\d22)|(NL\d2[A-Z]4\d10)|(LV\d2[A-Z]4\d13)|((?:BG|GB|IE)\d2[A-Z]4\d14)|(GI\d2[A-Z]4\d15)|(RO\d2[A-Z]4\d16)|(MT\d2[A-Z]4\d23)|(NO\d13)|((?:DK|FI)\d16)|((?:SI)\d17)|((?:AT|EE|LU|LT)\d18)|((?:HR|LI|CH)\d19)|((?:DE|VA)\d20)|((?:AD|CZ|ES|MD|SK|SE)\d22)|(PT\d23)|((?:IS)\d24)|((?:BE)\d14)|((?:FR|MC|GR)\d25)|((?:PL|HU|CY)\d26))$
规格:
https://www.iban.com/structure https://docs.google.com/spreadsheets/d/1376mu58jQ2P5jGX7tIXGrFfwgfo0RHO7RBRSpKcViIs/edit?usp=sharingGoogle Sheet 基于上述数据结构,使用更方便测试: https://regex101.com/r/oLRltj/1/
任何国家/地区的 IBAN 正则表达式
^(?:(?:CR|DE|ME|RS|VA)\d20|(?:CZ|ES|SE|SK|TN)\d22|(?:DK|FI|FO|GL|SD)\d16|(?:AT|BA|EE|LT|XK)\d18|(?:AE|IL|TL)\d21|(?:LY|PT|ST)\d23|(?:IT|SM)\d2[A-Z]\d10[A-Za-z0-9]12|(?:HU|PL)\d26|(?:AL|CY)\d10[A-Za-z0-9]16|(?:CH|LI)\d7[A-Za-z0-9]12|(?:FR|MC)\d12[A-Za-z0-9]11\d2|(?:GB|IE)\d2[A-Z]4\d14|(?:KZ|LU)\d5[A-Za-z0-9]13|(?:GI|IQ)\d2[A-Z]4[A-Za-z0-9]15|(?:PK|RO)\d2[A-Z]4[A-Za-z0-9]16|(?:PS|QA)\d2[A-Z]4[A-Za-z0-9]21|AD\d10[A-Za-z0-9]12|AZ\d2[A-Z]4[A-Za-z0-9]20|BE\d14|BG\d2[A-Z]4\d6[A-Za-z0-9]8|BH\d2[A-Z]4[A-Za-z0-9]14|BR\d25[A-Z][A-Za-z0-9]|BY\d2[A-Za-z0-9]4\d4[A-Za-z0-9]16|DO\d2[A-Za-z0-9]4\d20|EG\d27|GE\d2[A-Z]\d16|GT\d2[A-Za-z0-9]24|GR\d9[A-Za-z0-9]16|HR\d19|IS\d24|JO\d2[A-Z]4\d4[A-Za-z0-9]18|KW\d2[A-Z]4[A-Za-z0-9]22|LC\d2[A-Z]4[A-Za-z0-9]24|LB\d6[A-Za-z0-9]20|LV\d2[A-Z]4\d13|MD\d2[A-Za-z0-9]20|MK\d5[A-Za-z0-9]10\d2|MR\d25|MT\d2[A-Z]4\d5[A-Za-z0-9]18|MU\d2[A-Z]4\d19[A-Z]3|NL\d2[A-Z]4\d10|NO\d13|SA\d4[A-Za-z0-9]18|SC\d2[A-Z]4\d20[A-Z]3|SI\d17|SV\d2[A-Z]4\d20|TR\d8[A-Za-z0-9]16|UA\d8[A-Za-z0-9]19|VG\d2[A-Z]4\d16|GE\d2[A-Z]2\d16)$
第二个正则表达式取自 https://***.com/a/69068004/2391795,稍作修改以添加对 GE(格鲁吉亚)国家/地区的适当支持。
测试: https://regex101.com/r/I3oiuo/1/
【讨论】:
【参考方案10】:只要使用这个网站的 api : 去https://api.ibanapi.com 并得到 apk_key
iban = SA4705000068203056854000 api_key = ea649b36c1d1648bf0f12df82a8da475e2ee3447 url = 'https://api.ibanapi.com/v1/validate/'iban+'?api_key='+api_key+''
IBAN 检查器
检查 IBAN 的结构并为验证引擎做好准备 确保该国家/地区根据 Swift 公共注册支持 IBAN 使用校验位验证 IBAN。 如果支持***验证,则会通过它运行 从我们的注册中心获取此 IBAN 的银行信息
【讨论】:
以上是关于IBAN 验证检查的主要内容,如果未能解决你的问题,请参考以下文章