Regex for IBAN allowing for white spaces AND checking for exact length

偶尔善良 提交于 2019-11-28 07:45:26

Because you should use the right tool for the right task: you should not rely on regexps to validate IBAN numbers, but instead use the IBAN checksum algorithm to check the whole code is actually correct, making any regexp superfluous and redundant. i.e.: remove all spaces, rearrange the code, convert to integers, and compute remainder, here it's best explained.

Though, there am I trying to answer your question, for the fun of it:

what about:

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

which only difference is allowing a whitespace (or not) after each occurence of a alphanumeric character.

here is the visualization:

edit: for the OP's information, the only difference is that this regexp, from @ulugbex-umirov: (?:\s*[0-9a-zA-Z]\s*) does a lookahead check to see if there's a space between the iso country code and the checksum (which only made of numerical digits), which I do not support on purpose.

And actually to support a correct IBAN syntax, which is formed of groups of 4 characters, as the wikipedia page says:

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

example

If your UI is in Javascript, you can use that library for doing IBAN validation:

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

so you know this is a valid IBAN, and can validate it before the data is ever even sent to the backend. Simpler, lighter and more elegant… Why do something else?

Original:

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

Debuggex Demo

Modified:

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

Debuggex Demo

Most simple solution I can think of:

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

In particular, your initial [DE]{2} is wrong, as it allows 'DD', 'EE', 'ED' as well as the intended 'DE'.

This is the correct regex to match DE IBAN account numbers:

DE\d{2}[ ]\d{4}[ ]\d{4}[ ]\d{4}[ ]\d{4}[ ]\d{2}|DE\d{20}  Pass:   DE89 3704 0044 0532 0130 00|||DE89370400440532013000 Fail:   DE89-3704-0044-0532-0130-00 
Jonny 5

To allow any amount of spaces anywhere:

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

As you want to allow lower letters, also DE might be lower?

^ *[Dd] *[Ee]( *[A-Za-z0-9]){20} *$ 
  • ^ matches the start of the string
  • $ end anchor
  • in between each characters there are optional spaces *
  • [character class] defines a set/range of characters

To allow at most one space in between each characters, replace the quantifier * (any amount of) with ? (0 or 1). If supported, \s shorthand can be used to match [ \t\r\n\f] instead of space only.

Test on regex101.com, also see the SO regex FAQ

Using Google Apps Script, I pasted Laurent's code from github into a script and added the following code to test.

// 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); } 

The only thing needed to run the example code was commenting out the require('iban') line: // var IBAN = require('iban'); Finally, instead of using client handlers to attempt a RegEx validation of IBAN input, I use a a server handler to do the validation.

Here is a list of IBANs from 70 Countries. I generated it with a python script i wrote based on this https://en.wikipedia.org/wiki/International_Bank_Account_Number

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?  
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!