web-dev-qa-db-ja.com

IBAN Regexデザイン

すべての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
8
Maximus

ちょうどそれらの国からの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    

regex101テストはこちら

完全な文字列を検証することが意図されている場合は、正規表現を簡略化できることに注意してください。
ネガティブな先読み(?!...)は必要ありません。
そして単語の境界\bは、start ^ そして終わり $の行。

^[A-Z]{2}[0-9]{2}(?:[ ]?[0-9]{4}){4}(?:[ ]?[0-9]{1,2})?$

また、4つの接続された数字の4つのグループが問題にならない場合、その1つはさらに簡素化できます。

^[A-Z]{2}(?:[ ]?[0-9]){18,20}$

備考

しかし、世界中のIBAN番号を一致させたい場合はどうでしょうか?
次に、IBANのBBAN部分には、最大30個の数字または大文字を使用できます。 参照
また、スペースまたはダッシュを使用して、または間に何も入力しないでください。
例えば: 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})?$

regex101テストはこちら

また、純粋な正規表現ソリューションでは計算ができないことに注意してください。
したがって、実際に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
 '[email protected]' // 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))
});
20
LukStorms

以下に、提供したパターンに有効な提案を示します。

[A-Z]{2}\d{2} ?\d{4} ?\d{4} ?\d{4} ?\d{4} ?[\d]{0,2}

regex101で試してください


説明

  • [A-Z]{2}\d{2} ? 2つの大文字とそれに続く2桁の数字(オプションのスペース)
  • \d{4} ? 4桁、4回繰り返されます(オプションのスペース)
  • [\d]{0,2} 0〜2桁
6
Mistalis

次のような正規表現を使用できます。

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

作業デモ

これは、これらの文字列形式のみに一致します

1
Federico Piazza

正しい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})?$

以下にライブの例を示します。 https://regex101.com/r/ZyIPLD/1

1
ssc-hrep3