Regex IBAN正则表达式设计

Regex IBAN正则表达式设计,regex,iban,Regex,Iban,请帮助我设计正则表达式,将所有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 您可以使用这样的正则表达式: ^[A-Z]{2}\d{2} (?:\d{4} ){3}\d

请帮助我设计正则表达式,将所有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

您可以使用这样的正则表达式:

^[A-Z]{2}\d{2} (?:\d{4} ){3}\d{4}(?: \d\d?)?$


这将仅与那些字符串格式匹配这里有一个建议可能适用于您提供的模式:

[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位

最好查阅规范,以获得正确的IBAN编号。但是,如果您希望使用与现有正则表达式类似的正则表达式,但带有空格,则可以使用以下正则表达式:

^[a-zA-Z]{2}[0-9]{2}\s?[a-zA-Z0-9]{4}\s?[0-9]{4}\s?[0-9]{3}([a-zA-Z0-9]\s?[a-zA-Z0-9]{0,4}\s?[a-zA-Z0-9]{0,4}\s?[a-zA-Z0-9]{0,4}\s?[a-zA-Z0-9]{0,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    

请注意,如果目的是验证完整字符串,则可以简化正则表达式。
因为那时不需要消极的前瞻性
(?!…)

而单词边界
\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个数字或大写字母
并且可以用空格或破折号书写,也可以不使用空格或破折号书写。
例如:
CC12 XXXX 12XX 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-slikeiban(str){
返回/^([A-Z]{2}[\-]?[0-9]{2})(?=(?:[\-]?[A-Z0-9]){9,30}$)((?:[\-]?[A-Z0-9]{3,5}{2,7})([\-]?[A-Z0-9]{1,3})$/)测试(str);
}
函数validateIbanChecksum(iban){
const ibanStripped=iban.replace(//[^A-Z0-9]+//gi',)//仅保留数字和字母
.toUpperCase();//计算需要大写
常数m=ibanStripped.match(/^([A-Z]{2})([0-9]{2})([A-Z0-9]{9,30})$/);
如果(!m)返回false;
常数numberriced=(m[3]+m[1]+m[2])。替换(/[A-Z]/g,函数(ch){
//用数字10到35替换大写字符
返回(ch.charCodeAt(0)-55);
});
//结果是javascript在不降低精度的情况下处理的时间太长。
//所以诀窍是把绳子切成更小的部分。
const mod97=numberriced.match(/\d{1,7}/g)
.reduce(函数(总计,当前){返回编号(总计+当前)%97}'”;
返回(mod97==1);
};
var arr=[
‘DE89 3704 0044 0532 0130 00’,//确定
‘AT61 1904 3002 3457 3201’,//好的
“FR14 2004 1010 0505 0001 3”,//校验和错误
‘GB82-WEST-1234-5698-7654-32’,//确定
'NL20INGB0001234567',//确定
'XX00 1234 5678 9012 3456 7890 1234 5678 90',//气味正常
‘YY001234567890123456788901234567890’,//气味正常
“NL20-ING-B0-00-12-34-567”,//格式错误,但校验和有效
'XX22YYY1234567890123',//校验和错误
'foo@i.ban“//闻起来都不像伊班
];
arr.forEach(函数(str){
log('['+str+']闻起来像IBAN:'+stoureslikeiban(str));
console.log('['+str+']有效的IBAN校验和:'+validateIbanChecksum(str))

});是否尝试在所需位置插入零或一个空格?不要害怕,如果你稍微乱摆弄一下,修改后的正则表达式不会爆炸。FWIW,这不能可靠地验证iban。我们还需要做更多的工作。一个好的、广泛的、可以使用的列表是。您可以收集已定义的所有模式,并调整它们以接受空白。例如:
DE\d{2}\s*\d{4}\s*\d{4}\s*\d{4}\s*\d{4}\s*\d{2}
将与您的第一个示例匹配。要使用所有可能的空格验证IBAN,只需在验证之前删除空格,这会使事情变得更简单。但是实际上你不能用正则表达式完全验证,因为验证的主键是校验和。所以,要验证一个iban,我要做:1)规范化:转换为大写,删除除了
[A-Z0-9]
2)匹配模式
[A-Z]{2}[0-9]{2}[A-Z0-9]{1,30}
3)验证校验和。此外,您可以检查(特定于国家/地区的)长度,但在大多数用例中不需要检查,除非您希望通过重新计算校验和来排除有人组成了IBAN。谢谢,但如果您删除空格,则这不起作用。我的意思是我无法理解如何处理任何空格位置(包括没有空格)。@Maximus,正则表达式帮助您匹配模式,如果您需要匹配任意字符,那么您必须始终使用空格检查,例如:
[a-Z]\s*[a-Z]\s*\d\s*\d\s*\d\s*..等
。您的问题不清楚,您应该更新它,并添加更多的描述和更多的样本。但是,如果我的答案回答了您的问题,并且您只想将空格设置为可选,则只需在每个空格中添加
,这将不允许在开头后面添加字母。他的现有模式允许这样做。你在正则表达式中看到了4个字符的银行代码吗?例如NL20INGB0001234567和GB82WEST12345698765432。@wind rider这些正则表达式的编写符合问题要求的格式。其中一些数字按4分组。但事实上,IBAN的BBAN部分最多可以包含30个特定于国家/地区的字母数字字符。@wind rider出于完整性考虑,我已经包括在内了