Bashを使用してクレジットカード番号を確認する

Bashを使用してクレジットカード番号を確認する

有効なカード番号を検出するには、次の正規表現を使用しています。

[2-6][0-9]{3}([ -]?)[0-9]{4}([ -]?)[0-9]{4}([ -]?)[0-9]{3,4}([ -]?)[0-9]{0,3}[^a-zA-Z]

ただし、以下は検出されません。

374355011240344
373116614411000

しかし、私のウェブサイトで同じコンテンツを使用している場合:http://www.regexr.com/、すべてが検出されました。

これと互換性の問題がありますか?

私が望むのは、どのパターンでも検出することです。

  1. 2,3,4,5,6から始まる
  2. 4桁の間隔で「」または「-」で区切ることができます。
  3. 長さは13~19まで可能です。

私が使用したコマンドは次のとおりです。

for i in * */*;
do
    grep -ocE "[2-6][0-9]{3}([ -]?)[0-9]{4}([ -]?)[0-9]{4}([ -]?)[0-9]{3,4}([ -]?)[0-9]{0,3}[^a-zA-Z]" "$i";
done    `

ベストアンサー1

式を提供するユーティリティ、コマンドを呼び出すときに使用される引数、コマンドが呼び出されるシェルなどに応じて、正規表現を評価する方法に違いと制限があります。

ただし、grepで正規表現を使用すると、正規表現の最後の部分が一致としてリストされていないため、文字数を超えています(検索する文字ではありません)。

[{0} 01:49:15] $ echo "374355011240344" | grep -Eo "[2-6][0-9]{3}([ -]?)[0-9]{4}([ -]?)[0-9]{4}([ -]?)[0-9]{3,4}([ -]?)[0-9]{0,3}[^a-zA-Z]"                                                                                                                                                                                                                    
[{1} 01:49:33] $ echo "374355011240344" | grep -Eo "[2-6][0-9]{3}([ -]?)[0-9]{4}([ -]?)[0-9]{4}([ -]?)[0-9]{3,4}([ -]?)[0-9]{0,3}[^a-zA-Z]?"                                                                                        
374355011240344

次のウェブサイトでは、クレジットカードの正規表現に関する本を書きました。クレジットカード正規表現

この正規表現は、有効なVisa、MC、Amexと一致します。

"^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13})$"

私が提供したリンクは、すべての主要CCを含むようにこの正規表現を「拡張」する方法を示しています。彼らの一般的なアプローチ(価値がある点については同意します)は、パターンマッチングの前に空白、ダッシュなどを削除して無関係な文字を削除することです。これは調査する価値があるかもしれません。

他の多くのウェブサイトがあります:

https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9781449327453/ch04s20.html

http://reluctanthacker.rollett.org/creating-regex-finding-credit-card-numbers-grep

おすすめ記事