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

旧巷老猫 提交于 2019-11-27 01:57:43

问题


I need to check an input field for a German IBAN. The user should be allowed to leave in white spaces and input should be validated to have a starting DE and then exact 20 characters numbers and letters.

Without the white space allowance, I tried

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

but I cannot find where and how I can add "white spaces anywhere allowed.

This should be simple, but I simply cannot find a solution.

Thanks for help!


回答1:


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?




回答2:


Original:

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

Debuggex Demo

Modified:

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

Debuggex Demo




回答3:


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




回答4:


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 



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




回答6:


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.




回答7:


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?  


来源:https://stackoverflow.com/questions/23471591/regex-for-iban-allowing-for-white-spaces-and-checking-for-exact-length

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