Как проверить PAN карты в текстовой строке? - PullRequest
0 голосов
/ 17 мая 2018

У меня есть строка с любым текстом. Это может быть так - "abcdef 123456789521 zxcvb", и - "45651256", и - "asdad 564654 sddsf 4". Я хочу найти в тексте номер PAN, который может быть разной длины, а затем проверить его с помощью алгоритма luhn. Я знаю, что могу найти его по regx, но это требует такого выражения - "Pattern.compile("[A-Z]{5}[0-9]{4}[A-Z]{1}");. Но я не знаю, сколько символов и цифр и в каком порядке будет содержать моя строка. Может быть кто-нибудь знает, как это сделать? Любой совет?

1 Ответ

0 голосов
/ 17 мая 2018

Я предполагаю, что под PAN вы подразумеваете номер кредитной карты ( см. PAN в википедии ).

Согласно этой статье цифры должны быть длиной от 8 до 19 цифр. Таким образом, вы ищете в тексте числа с длиной в этом интервале, сохраняете их и проверяете их с помощью алгоритма Luhn . Вот реализация, которая находит числа длиной от 8 до 19 цифр и выполняет проверку Luhn:

import java.util.ArrayList;
import java.util.regex.Pattern;    
import java.util.regex.Matcher;

public class main {
    public static void main(String[] args) {
        String text = "helloWor4712389062l648977135536d 239012390oife234923 uiwed wq12893129038";

        ArrayList<String> result = getPossiblePANs(text);
        for(String pan : result) {
            System.out.print("Possible PAN: " + pan);
            if(luhnCheck(pan))
                System.out.println(" is valid!");
            else
                System.out.println(" is INVALID!");
        }
    }


    static ArrayList<String> getPossiblePANs(String text){  //Numbers w. 8-19 digits
        ArrayList<String> res = new ArrayList<>();
        Pattern p = Pattern.compile("\\d{8,19}+");
        Matcher m = p.matcher(text);
        while(m.find())
            res.add(m.group());
        return res;
    }

    static boolean luhnCheck(String cardNumber){
        if(cardNumber.length() < 8 || cardNumber.length() > 19)
            return false;
        int sum = 0;
        int begin = cardNumber.length() - 2;
        for(int i = begin; i >= 0; i-=2){
            int number = Integer.parseInt(cardNumber.substring(i, i+1)) * 2;
            if(number > 9) sum += (number - 9);
            else sum += number;
        }
        return (sum % 10) == 0;
    }
}

Possible PAN: 4712389062 is INVALID!
Possible PAN: 648977135536 is INVALID!
Possible PAN: 239012390 is INVALID!
Possible PAN: 12893129038 is valid!
...