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 验证检查的主要内容,如果未能解决你的问题,请参考以下文章

IBAN 的正则表达式允许空格并检查确切长度

验证 IBAN PHP

机器学习检查 IBAN 校验和

C 将 20 位字符串转换为数字以进行 IBAN 验证

如何使用 Apache IBANCheckDigit 检查 IBAN 号码?

计算并检查 IBAN [重复]