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

Posted

技术标签:

【中文标题】IBAN 的正则表达式允许空格并检查确切长度【英文标题】:Regex for IBAN allowing for white spaces AND checking for exact length 【发布时间】:2014-06-21 16:52:02 【问题描述】:

我需要检查德国 IBAN 的输入字段。应该允许用户离开空格并且应该验证输入是否具有起始DE,然后是精确的 20 个字符的数字和字母。

没有留白,我试过了

^[DE]2([0-9a-zA-Z]20)$

但我找不到在哪里以及如何添加“允许的任何地方的空白”。

这应该很简单,但我根本找不到解决方案。

感谢您的帮助!

【问题讨论】:

您使用什么语言?从字符串中删除所有空格是一个合适的解决方案吗?另外,仅供参考,[DE]2 匹配 DDED:请参阅 regular-expressions.info/charclass.html 正如我在回答中所说,您没有使用正确的工具来完成任务。您不应该根据格式检查像 IBAN 这样重要的东西,而是通过计算校验和来检查整个代码的有效性,这在算法上与正则表达式检查一样复杂。 坦克很多!我们确实在后端正确验证了正确的 IBAN 格式,但也希望在前端引导用户。 不倾向于只是指导,只是验证它。再说一遍:校验和计算比正则表达式更快、更轻、更容易,它是验证 IBAN 输入的最佳方式! 【参考方案1】:

原文:

^[DE]2([0-9a-zA-Z]20)$

Debuggex Demo

修改:

^DE(?:\s*[0-9a-zA-Z]\s*)20$

Debuggex Demo

【讨论】:

【参考方案2】:

因为您应该为正确的任务使用正确的工具:您不应该依赖正则表达式来验证 IBAN 号码,而是使用 IBAN 校验和算法来检查整个代码实际上是否正确,从而任何正则表达式都是多余和多余的。 :删除所有空格,重新排列代码,转换为整数,然后计算余数,here it's best explained。

不过,为了好玩,我还是想回答你的问题:

怎么样:

^DE([0-9a-zA-Z]\s?)20$

唯一的区别是在每次出现字母数字字符后允许(或不允许)空格。

here 是可视化:

编辑:对于 OP 的信息,唯一的区别是这个正则表达式,来自@ulugbex-umirov:(?:\s*[0-9a-zA-Z]\s*) 会先行检查iso国家代码和校验和之间是否有空格(仅由数字),我故意不支持。

实际上是为了支持正确的 IBAN 语法,它由 4 个字符组成,正如 wikipedia page 所说:

^DE\d2\s?([0-9a-zA-Z]4\s?)4[0-9a-zA-Z]2$

example

如果您的 UI 使用 javascript,您可以使用 that 库进行 IBAN 验证:

<script src="iban.js"></script>
<script>
    // the API is now accessible from the window.IBAN global object
    IBAN.isValid('hello world'); // false
    IBAN.isValid('BE68539007547034'); // true
</script>

所以您知道这是一个有效的 IBAN,并且可以在数据甚至发送到后端之前对其进行验证。更简单、更轻便、更优雅……为什么要做其他事情?

【讨论】:

关于不依赖正则表达式来验证 IBAN 的好处是,但我认为可以在前端使用正则表达式来捕捉任何明显的错误并指导用户。我会在后端进行更严格的 IBAN 验证。 非常感谢您快速且非常有帮助的回答!我们也在后端进行验证。正则表达式是附加的,用于用户指导 顺便说一句,如果你的 UI 是 javascript,有一堆 JS 库:here、there 或 there 会阻碍校验和计算。 @fbitterlich 您是否在任何地方发布了有关此错误的详细信息?我不认为它是 arhs/iban.js github 页面上的问题。 @zmo:这个答案让我希望能够投票两次 :-)【参考方案3】:

我能想到的最简单的解决方案:

^DE(\s*[[:alnum:]])20\s*$

特别是,您最初的 [DE]2 是错误的,因为它允许“DD”、“EE”、“ED”以及预期的“DE”。

【讨论】:

【参考方案4】:

在任何地方允许任意数量的空格:

^ *D *E( *[A-Za-z0-9])20 *$

既然你想允许小写字母,DE 也可能小一点?

^ *[Dd] *[Ee]( *[A-Za-z0-9])20 *$
^ 匹配字符串的开头 $结束锚 在每个字符之间有可选的空格* [character class] 定义一组/范围的字符

要在每个字符之间最多允许一个空格,请将 quantifier *(任意数量)替换为 ?(0 或 1)。如果支持,\s shorthand 可用于匹配 [ \t\r\n\f] 而不仅仅是空格。

Test on regex101.com,另见SO regex FAQ

【讨论】:

【参考方案5】:

这是匹配 DE IBAN 帐号的正确正则表达式:

DE\d2[ ]\d4[ ]\d4[ ]\d4[ ]\d4[ ]\d2|DE\d20

Pass:   DE89 3704 0044 0532 0130 00|||DE89370400440532013000
Fail:   DE89-3704-0044-0532-0130-00

【讨论】:

【参考方案6】:

使用 Google Apps 脚本,我将 Laurent's code 从 github 粘贴到 script 并添加以下代码进行测试。

// Use the Apps Script IDE's "Run" menu to execute this code.
// Then look at the View > Logs menu to see execution results.

function myFunction() 
//https://github.com/arhs/iban.js/blob/master/README.md
// var IBAN = require('iban');
var t1 = IBAN.isValid('hello world'); // false
var t2 = IBAN.isValid('BE68539007547034'); // true
var t3 = IBAN.isValid('BE68 5390 0754 7034'); // true

Logger.log("Test 1 = %s", t1);
Logger.log("Test 2 = %s", t2);
Logger.log("Test 3 = %s", t3);

运行示例代码唯一需要做的就是注释掉 require('iban') 行: // var IBAN = require('iban'); 最后,我没有使用客户端处理程序尝试对 IBAN 输入进行 RegEx 验证,而是使用服务器处理程序进行验证。

【讨论】:

【参考方案7】:

以下是来自 70 个国家/地区的 IBAN 列表。我使用基于此 https://en.wikipedia.org/wiki/International_Bank_Account_Number 编写的 python 脚本生成它

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? 

【讨论】:

不知道为什么投反对票。这个列表至少非常有用。这些似乎是正确的。德语正则表达式在您的答案中。

以上是关于IBAN 的正则表达式允许空格并检查确切长度的主要内容,如果未能解决你的问题,请参考以下文章

IBAN 正则表达式设计 [重复]

正则表达式检查是不是存在确切的字符串

如何为 IBAN 数组正确添加空格

IBAN正则表达式(所有IBAN)

正则表达式来掩盖 IBAN

仅名字的正则表达式英语