【问题标题】:IBAN Validation checkIBAN 验证检查
【发布时间】:2014-03-22 14:13:51
【问题描述】:

我需要使用 JavaScript 进行 IBAN 验证检查。我需要遵守的规则是:

验证 IBAN 通过将 IBAN 转换为整数并对其执行基本的 mod-97 操作(如 ISO 7064 中所述)来验证 IBAN。如果 IBAN 有效,则余数等于 1。

  1. 根据国家/地区检查 IBAN 总长度是否正确。如果不是,则 IBAN 无效

  2. 将四个初始字符移到字符串的末尾

  3. 将字符串中的每个字母替换为两位数,从而扩展字符串,其中 A = 10, B = 11, ..., Z = 35

  4. 将字符串解释为十进制整数并计算该数字除以 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"));

【问题讨论】:

    标签: javascript iban


    【解决方案1】:

    您可以使用此库来验证和格式化 IBAN:https://github.com/arhs/iban.js(免责声明:我编写了该库)

    但是,不支持俄罗斯和白俄罗斯,因为我在 IBAN page of wikipediaofficial IBAN registry 上都找不到任何提及这些国家的信息,所以恐怕您必须自己修改库代码以添加它。

    【讨论】:

    • 此代码无法验证摩尔多瓦 IBAN。例如MD75EX0900002374642125EU。根据 www.iban.com 它是有效的
    • 谢谢@armen。已打开的问题 (github.com/arhs/iban.js/issues/23) 将很快解决。
    • 非常好的@Laurent VB,修复后有邮件列表通知我吗?
    • @armen 你可以订阅 github 问题通知。我也会来更新这个 SO 线程。
    【解决方案2】:

    【讨论】:

      【解决方案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})(\d{2})([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})(\d{2})([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)\d{2}[A-Z]\d{22}|NL\d{2}[A-Z]{4}\d{10}|RO\d{2}[A-Z]{4}\d[A-Z]\d{14}|LV\d{2}[A-Z]{4}\d{13}|FR\d{19}[A-Z]\d{5}|LI\d{17}[A-Z]{2}|MD\d{2}[A-Z]{2}\d{18}|(?:BG|GB|IE)\d{2}[A-Z]{4}\d{14}|BH\d{2}[A-Z]{4}\d{10}[A-Z]{2}\d{2}|GE\d{2}[A-Z]{2}\d{16}|GI\d{2}[A-Z]{4}\d{15}|BR\d{25}[A-Z]\d|MU\d{2}[A-Z]{4}\d{19}[A-Z]{3}|PS\d{2}[A-Z]{4}\d{21}|QA\d{2}[A-Z]{4}\d{14}[A-Z]{7}|(?:AZ|DO|GT)\d{2}[A-Z]{4}\d{20}|(?:BJ|ML|SN|CI)\d{2}[A-Z]\d{23}|(?:PK|VG)\d{2}[A-Z]{4}\d{16}|(?:KW|JO)\d{2}[A-Z]{4}\d{22}|MT\d{2}[A-Z]{4}\d{12}[A-Z]{7}\d{3}[A-Z]|NO\d{13}|(?:BE|BI)\d{14}|(?:DK|FI|GL|FO)\d{16}|(?:MK|SI)\d{17}|(?:BA|LT|AT|EE|KZ|LU|XK)\d{18}|(?:HR|CH|CR)\d{19}|(?:DE|ME|RS)\d{20}|(?:AE|IL|TL)\d{21}|(?:AD|CZ|ES|SA|DZ|SK|SE|TN)\d{22}|(?:PT|AO|CV|MZ)\d{23}|(?:IS|IR|TR)\d{24}|(?:MR|MC|BF|CM|GR|MG)\d{25}|(?:AL|DO|LB|PL|CY|HU)\d{26})$/i
        

        【讨论】:

        • 不错,但它不能验证 IBAN。
        【解决方案8】:

        根据最新的 SWIFT IBAN Registrar 出版物(2021 年 6 月),here,我更新了 Rony Nasr 的 REGEX 提案。它包括 79 个国家/地区并检查特定国家/地区的 IBAN 结构和长度。 (但是,它不会进行校验和 MOD97 验证)。

        /^(?:(?:CR|DE|ME|RS|VA)\d{20}|(?:CZ|ES|SE|SK|TN)\d{22}|(?:DK|FI|FO|GL|SD)\d{16}|(?:AT|BA|EE|LT|XK)\d{18}|(?:AE|IL|TL)\d{21}|(?:LY|PT|ST)\d{23}|(?:IT|SM)\d{2}[A-Z]\d{10}[A-Za-z0-9]{12}|(?:HU|PL)\d{26}|(?:AL|CY)\d{10}[A-Za-z0-9]{16}|(?:CH|LI)\d{7}[A-Za-z0-9]{12}|(?:FR|MC)\d{12}[A-Za-z0-9]{11}\d{2}|(?:GB|IE)\d{2}[A-Z]{4}\d{14}|(?:KZ|LU)\d{5}[A-Za-z0-9]{13}|(?:GI|IQ)\d{2}[A-Z]{4}[A-Za-z0-9]{15}|(?:PK|RO)\d{2}[A-Z]{4}[A-Za-z0-9]{16}|(?:PS|QA)\d{2}[A-Z]{4}[A-Za-z0-9]{21}|AD\d{10}[A-Za-z0-9]{12}|AZ\d{2}[A-Z]{4}[A-Za-z0-9]{20}|BE\d{14}|BG\d{2}[A-Z]{4}\d{6}[A-Za-z0-9]{8}|BH\d{2}[A-Z]{4}[A-Za-z0-9]{14}|BR\d{25}[A-Z][A-Za-z0-9]|BY\d{2}[A-Za-z0-9]{4}\d{4}[A-Za-z0-9]{16}|DO\d{2}[A-Za-z0-9]{4}\d{20}|EG\d{27}|GE\d{2}[A-Z]\d{16}|GT\d{2}[A-Za-z0-9]{24}|GR\d{9}[A-Za-z0-9]{16}|HR\d{19}|IS\d{24}|JO\d{2}[A-Z]{4}\d{4}[A-Za-z0-9]{18}|KW\d{2}[A-Z]{4}[A-Za-z0-9]{22}|LC\d{2}[A-Z]{4}[A-Za-z0-9]{24}|LB\d{6}[A-Za-z0-9]{20}|LV\d{2}[A-Z]{4}\d{13}|MD\d{2}[A-Za-z0-9]{20}|MK\d{5}[A-Za-z0-9]{10}\d{2}|MR\d{25}|MT\d{2}[A-Z]{4}\d{5}[A-Za-z0-9]{18}|MU\d{2}[A-Z]{4}\d{19}[A-Z]{3}|NL\d{2}[A-Z]{4}\d{10}|NO\d{13}|SA\d{4}[A-Za-z0-9]{18}|SC\d{2}[A-Z]{4}\d{20}[A-Z]{3}|SI\d{17}|SV\d{2}[A-Z]{4}\d{20}|TR\d{8}[A-Za-z0-9]{16}|UA\d{8}[A-Za-z0-9]{19}|VG\d{2}[A-Z]{4}\d{16}|GE\d{2}[A-Z]{2}\d{16})$/gm
        

        【讨论】:

        • 你错过了 GE 国家。
        【解决方案9】:

        我写了 2 个正则表达式,第一个适用于仅 SEPA 的国家/地区,另一个适用于所有支持 IBAN 的国家/地区,截至 2021-10。

        SEPA 区域内国家/地区的 IBAN 正则表达式

        第一个检查 IBAN 在 SEPA 区域内是否有效,IBAN 必须属于 SEPA 区域内的国家/地区。 (它认为 SEPA 区域之外的 IBAN 无效)

        ^(?:((?:IT|SM)\d{2}[A-Z]{1}\d{22})|(NL\d{2}[A-Z]{4}\d{10})|(LV\d{2}[A-Z]{4}\d{13})|((?:BG|GB|IE)\d{2}[A-Z]{4}\d{14})|(GI\d{2}[A-Z]{4}\d{15})|(RO\d{2}[A-Z]{4}\d{16})|(MT\d{2}[A-Z]{4}\d{23})|(NO\d{13})|((?:DK|FI)\d{16})|((?:SI)\d{17})|((?:AT|EE|LU|LT)\d{18})|((?:HR|LI|CH)\d{19})|((?:DE|VA)\d{20})|((?:AD|CZ|ES|MD|SK|SE)\d{22})|(PT\d{23})|((?:IS)\d{24})|((?:BE)\d{14})|((?:FR|MC|GR)\d{25})|((?:PL|HU|CY)\d{26}))$
        

        规格

        测试https://regex101.com/r/oLRltj/1/

        任何国家/地区的 IBAN 正则表达式

        ^(?:(?:CR|DE|ME|RS|VA)\d{20}|(?:CZ|ES|SE|SK|TN)\d{22}|(?:DK|FI|FO|GL|SD)\d{16}|(?:AT|BA|EE|LT|XK)\d{18}|(?:AE|IL|TL)\d{21}|(?:LY|PT|ST)\d{23}|(?:IT|SM)\d{2}[A-Z]\d{10}[A-Za-z0-9]{12}|(?:HU|PL)\d{26}|(?:AL|CY)\d{10}[A-Za-z0-9]{16}|(?:CH|LI)\d{7}[A-Za-z0-9]{12}|(?:FR|MC)\d{12}[A-Za-z0-9]{11}\d{2}|(?:GB|IE)\d{2}[A-Z]{4}\d{14}|(?:KZ|LU)\d{5}[A-Za-z0-9]{13}|(?:GI|IQ)\d{2}[A-Z]{4}[A-Za-z0-9]{15}|(?:PK|RO)\d{2}[A-Z]{4}[A-Za-z0-9]{16}|(?:PS|QA)\d{2}[A-Z]{4}[A-Za-z0-9]{21}|AD\d{10}[A-Za-z0-9]{12}|AZ\d{2}[A-Z]{4}[A-Za-z0-9]{20}|BE\d{14}|BG\d{2}[A-Z]{4}\d{6}[A-Za-z0-9]{8}|BH\d{2}[A-Z]{4}[A-Za-z0-9]{14}|BR\d{25}[A-Z][A-Za-z0-9]|BY\d{2}[A-Za-z0-9]{4}\d{4}[A-Za-z0-9]{16}|DO\d{2}[A-Za-z0-9]{4}\d{20}|EG\d{27}|GE\d{2}[A-Z]\d{16}|GT\d{2}[A-Za-z0-9]{24}|GR\d{9}[A-Za-z0-9]{16}|HR\d{19}|IS\d{24}|JO\d{2}[A-Z]{4}\d{4}[A-Za-z0-9]{18}|KW\d{2}[A-Z]{4}[A-Za-z0-9]{22}|LC\d{2}[A-Z]{4}[A-Za-z0-9]{24}|LB\d{6}[A-Za-z0-9]{20}|LV\d{2}[A-Z]{4}\d{13}|MD\d{2}[A-Za-z0-9]{20}|MK\d{5}[A-Za-z0-9]{10}\d{2}|MR\d{25}|MT\d{2}[A-Z]{4}\d{5}[A-Za-z0-9]{18}|MU\d{2}[A-Z]{4}\d{19}[A-Z]{3}|NL\d{2}[A-Z]{4}\d{10}|NO\d{13}|SA\d{4}[A-Za-z0-9]{18}|SC\d{2}[A-Z]{4}\d{20}[A-Z]{3}|SI\d{17}|SV\d{2}[A-Z]{4}\d{20}|TR\d{8}[A-Za-z0-9]{16}|UA\d{8}[A-Za-z0-9]{19}|VG\d{2}[A-Z]{4}\d{16}|GE\d{2}[A-Z]{2}\d{16})$
        

        第二个正则表达式取自 https://stackoverflow.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 的银行信息

          【讨论】:

            猜你喜欢
            • 2019-07-19
            • 2015-05-30
            • 2018-10-17
            • 2019-04-06
            • 2014-01-25
            • 2015-11-19
            • 2017-10-03
            • 2018-11-30
            • 2016-11-08
            相关资源
            最近更新 更多