クイックスタート
チュートリアル
ツールと言語
リファレンス
書籍レビュー
正規表現の例
数値範囲
浮動小数点数
メールアドレス
IPアドレス
有効な日付
数値日付をテキストに変換
クレジットカード番号
行全体のマッチ
重複行の削除
プログラミング
近接する2つの単語
落とし穴
カタストロフィックバックトラッキング
過剰な繰り返し
サービス拒否攻撃
すべてをオプションにする
繰り返しキャプチャグループ
Unicodeと8ビットの混在
このサイトの詳細
はじめに
正規表現クイックスタート
正規表現チュートリアル
置換文字列チュートリアル
アプリケーションと言語
正規表現の例
正規表現リファレンス
置換文字列リファレンス
書籍レビュー
印刷可能なPDF
このサイトについて
RSSフィードとブログ
RegexMagic—Generate regular expressions matching credit card numbers

クレジットカード番号の検索と検証

いくつかの簡単な正規表現を使用することで、顧客が注文フォームに入力したクレジットカード番号が有効かどうかを簡単に検証できます。さらに、使用されているクレジットカードの種類を判別することも可能です。各カード発行会社は、最初の4桁で識別される独自のカード番号範囲を持っています。

少し異なる正規表現を使用すれば、より大きなドキュメント内からクレジットカード番号、またはクレジットカード番号の可能性のある数字列を見つけることができます。これは、セキュリティ監査において、顧客の財務情報を不適切に公開していないことを証明するのに非常に役立ちます。

まずは注文フォームから見ていきましょう。

スペースとダッシュの削除

最初のステップは、顧客が入力したカード番号から数字以外のすべての文字を削除することです。物理的なクレジットカードには、数字をグループ化するためのスペースがカード番号内にあり、人間が読みやすく入力しやすくなっています。そのため、注文フォームでは、スペースまたはダッシュを含むカード番号を受け入れる必要があります。

カード番号から数字以外のすべての文字を削除するには、スクリプト言語の「すべて置換」関数を使用して、正規表現[^0-9]+を検索し、何もない文字列に置き換えます。スペースとダッシュのみを置換する場合は、[ -]+を使用できます。この正規表現が奇妙に見える場合は、文字クラスでは、ハイフンが閉じ括弧の直前(または開き括弧または否定キャレットの直後)にある場合はリテラルとして扱われることを思い出してください。

プラス記号の目的がわからない方のために説明すると、これはパフォーマンスのためです。入力に連続した数字以外の文字(例:1===2)がある場合、[^0-9]+は3つの等号を一度にマッチさせ、1回の置換で削除します。プラス記号がないと、3回の置換が必要になります。この場合、節約されるのはわずか数マイクロ秒です。しかし、正規表現の効率性を常に意識しておくことは良い習慣です。ここでは節約はわずかですが、プラス記号を追加する手間もわずかです。

注文フォームでのクレジットカード番号の検証

クレジットカード番号の検証は、正規表現に最適な仕事です。クレジットカード番号は、13~16桁の数字のシーケンスであり、先頭のいくつかの特定の数字がカード発行会社を識別します。以下の具体的な正規表現を使用することで、顧客が受け付けていない種類のカードを使用しようとしたときに警告したり、異なるカードを使用した注文を異なる処理業者にルーティングしたりできます。これらの正規表現はすべてRegexBuddyのライブラリから取得しました。

ブランドを判別せずに、カード番号が有効かどうかだけを確認したい場合は、選択を使用して上記の6つの正規表現を組み合わせることができます。キャプチャしないグループは、アンカーを選択の外側に配置します。フリースペーシングにより、コメントを追加したり、正規表現をこのページの幅に合わせたりすることができます。

^(?:4[0-9]{12}(?:[0-9]{3})?          # Visa
 
|  (?:5[1-5][0-9]{2}                # MasterCard
     
| 222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}
 
|  3[47][0-9]{13}                   # American Express
 
|  3(?:0[0-5]|[68][0-9])[0-9]{11}      # Diners Club
 
|  6(?:011|5[0-9]{2})[0-9]{12}      # Discover
 
|  (?:2131|1800|35\d{3})\d{11}      # JCB
)$

これらの正規表現は、顧客が桁数を多くまたは少なく入力したために無効な番号を簡単に見つけることができます。ただし、間違った数字の番号は検出できません。そのためには、正規表現では実行できないLuhnアルゴリズムに従う必要があります。もちろん、番号が数学的に有効であっても、その番号のカードが発行されていることや、口座に資金があることを意味するわけではありません。正規表現の利点は、JavaScriptに組み込むことで、クレジットカード処理業者が注文を失敗させるまで顧客を30秒待たせることなく、明らかなエラーを即座にチェックできることです。また、カード処理業者が失敗したトランザクションに課金する場合、正規表現とLuhn検証の両方を実装する必要があります。

ドキュメント内のクレジットカード番号の検索

2つの簡単な変更を加えることで、上記の正規表現を使用して、より大きなドキュメント内でカード番号を見つけることができます。次のように、キャレットとドル記号単語境界に置き換えるだけです。\b4[0-9]{12}(?:[0-9]{3})?\b.

大規模なドキュメントサーバーを検索する予定がある場合は、より単純な正規表現を使用すると検索速度が向上します。会社が他の目的で16桁の番号を使用していない限り、誤検知はほとんどありません。正規表現\b\d{13,16}\bは、13~16桁の任意のシーケンスを見つけます。

ファイルでいっぱいのハードディスクを検索する場合、単一のカード番号を検証する場合のように、最初にスペースとダッシュを取り除くことはできません。スペースまたはダッシュを含むカード番号を見つけるには、\b(?:\d[ -]*?){13,16}\bを使用します。この正規表現は、番号内の任意の場所に任意の数のスペースとダッシュを許可します。これは実際には唯一の方法です。VisaとMasterCardは4桁のセットで数字を配置しますが、AmexとDiscoverは4、5、6桁のグループを使用します。番号を入力する人は、さらに異なる考えを持っているかもしれません。