有効なカード番号を検出するには、次の正規表現を使用しています。
[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/、すべてが検出されました。
これと互換性の問題がありますか?
私が望むのは、どのパターンでも検出することです。
- 2,3,4,5,6から始まる
- 4桁の間隔で「」または「-」で区切ることができます。
- 長さは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を含むようにこの正規表現を「拡張」する方法を示しています。彼らの一般的なアプローチ(価値がある点については同意します)は、パターンマッチングの前に空白、ダッシュなどを削除して無関係な文字を削除することです。これは調査する価値があるかもしれません。
他の多くのウェブサイトがあります:
http://reluctanthacker.rollett.org/creating-regex-finding-credit-card-numbers-grep
答え2
これはluhnアルゴリズムを使用してより良いことができます。 bashでこれを実装する方法についての議論はここにあります。https://codereview.stackexchange.com/questions/95211/validating-a-credit-card-number-using-luhns-algorithm