请帮助我设计正则表达式,将匹配所有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发布于 2017-06-20 23:31:30
仅以来自这些国家的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 请注意,如果要验证一个完整的字符串,则可以简化正则表达式。
因为那时将不再需要负向前瞻(?!...)。
并且可以用行的开始^和结束$来替换单词边界\b。
^[A-Z]{2}[0-9]{2}(?:[ ]?[0-9]{4}){4}(?:[ ]?[0-9]{1,2})?$此外,如果有4组4个相连的数字并不重要,那么这个数字甚至可以简化得更多。
^[A-Z]{2}(?:[ ]?[0-9]){18,20}$备注
但是如果你想匹配一个来自accross the world的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})?$还要注意,纯正则表达式解决方案不能进行计算。
因此,要实际验证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))
});
发布于 2017-06-20 22:56:12
以下是一个可能适用于您提供的模式的建议:
[A-Z]{2}\d{2} ?\d{4} ?\d{4} ?\d{4} ?\d{4} ?[\d]{0,2}说明
[A-Z]{2}\d{2} ? 2个大写字母后跟2个数字(可选空格) \d{4} ? 4个数字,重复4次(可选空格) [\d]{0,2} 0到2个数字发布于 2017-06-20 22:54:01
您可以像这样使用正则表达式:
^[A-Z]{2}\d{2} (?:\d{4} ){3}\d{4}(?: \d\d?)?$这将仅与这些字符串格式匹配
https://stackoverflow.com/questions/44656264
复制相似问题