Validação do número do cartão de crédito com o bash

1

Eu usei a seguinte expressão regular para detectar os números de cartão válidos.

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

Mas não detecta os seguintes:

374355011240344
373116614411000

Mas se eu usar o mesmo no site: link , todos esses são detectados.

Existe algum problema de compatibilidade com isso?

O que eu quero é detectar qualquer padrão:

  1. a partir de 2,3,4,5,6
  2. pode ser delimitado por "" ou "-" em intervalos de 4 dígitos (2345-3456-2345-2345 / 4567 6745 5645 4534 345)
  3. o comprimento pode ser de 13 a 19

Aqui está o comando que eu usei.

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    '
    
por user3148655 24.05.2016 / 07:14

2 respostas

2

Existem variações e limitações em como os regexs são avaliados com base no utilitário que fornece a expressão, os argumentos usados ao chamar o comando, o shell no qual o comando é chamado, entre outros problemas.

Com isso dito, a última seção da regex é o que está bloqueando a correspondência quando eu a uso com o grep; não está listado como opcional, portanto está excedendo a contagem de caracteres (procurando por não letras).

[{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

O seguinte site escreveu o livro sobre regexes de cartão de crédito: regex de cartão de crédito

Esta regex corresponderá a Visa, MC e Amex válidos:

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

O link fornecido mostra como "aumentar" esse regex para cobrir todos os principais CCs. Sua abordagem geral (com a qual eu concordo, pelo que vale a pena), é retirar caracteres estranhos antes da correspondência de padrões - removendo espaços, traços, etc. Pode valer a pena investigar.

Mais alguns sites:

link

link

    
por 24.05.2016 / 08:44
0

Isso seria melhor feito usando o algoritmo luhn. Uma discussão sobre como implementá-lo no bash pode ser encontrada aqui link

    
por 24.05.2016 / 10:28