regex - IBAN 正则表达式设计

标签 regex iban

这个问题在这里已经有了答案:





IBAN Validation check

(8 个回答)


3年前关闭。




请帮助我设计将所有 IBAN 与所有可能的空格匹配的正则表达式。因为我找到了那个,但它不适用于空格。

[a-zA-Z]{2}[0-9]{2}[a-zA-Z0-9]{4}[0-9]{7}([a-zA-Z0-9]?){0,16}

我至少需要那种格式:
DE89 3704 0044 0532 0130 00
AT61 1904 3002 3457 3201
FR14 2004 1010 0505 0001 3

最佳答案

仅以来自这些国家的 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 test here

请注意,如果目的是验证完整的字符串,则可以简化正则表达式。
由于那时不需要负前瞻 (?!...)
并且单词边界 \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个数字或大写字母。 Reference
并且可以用空格或破折号或中间什么都不写。
例如: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 test here

另请注意,纯正则表达式解决方案无法进行计算。
因此,要实际验证 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
 'foo@i.ban' // 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))
});

关于regex - IBAN 正则表达式设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44656264/

相关文章:

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

mysql - MariaDB 更新报错 inner join 和 select

oracle - 在 PL/SQL 中验证 IBAN

java - 如何为瑞典帐号生成 IBAN

regex - 如何管理带或不带的 URL?和/

javascript - ♥的字符代码是什么以及如何使用它?

java - 当输入字符串可以更改顺序时,在 Java 正则表达式中按名称提取组

regex - Haskell中原始但有效的grep克隆?

javascript - 在javascript中,我如何使用正则表达式来验证逗号与其他字符

php - 验证 IBAN PHP