如何验证文本字符串中的卡 PAN?
How can I verify card PAN in text string?
我有任何文本的字符串。可以这样-"abcdef 123456789521 zxcvb"
,-"45651256"
,-"asdad 564654 sddsf 4"
。我想在文本中搜索 PAN 号,它可以是不同的长度,然后用 luhn
算法验证它。我知道,我可以通过 regx 找到它,但它需要这样的表达式 - "Pattern.compile("[A-Z]{5}[0-9]{4}[A-Z]{1}");
。但我不知道我的字符串将包含多少个字符和数字以及顺序。可能有人知道该怎么做吗?有什么建议吗?
我假设 PAN 是指信用卡号 (see PAN on wikipedia)。
根据那篇文章,数字的长度必须在 8 到 19 位之间。因此,您在文本中搜索具有该间隔长度的数字,存储它们并使用 Luhn algorithm 检查它们。这是一个查找长度在 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!
我有任何文本的字符串。可以这样-"abcdef 123456789521 zxcvb"
,-"45651256"
,-"asdad 564654 sddsf 4"
。我想在文本中搜索 PAN 号,它可以是不同的长度,然后用 luhn
算法验证它。我知道,我可以通过 regx 找到它,但它需要这样的表达式 - "Pattern.compile("[A-Z]{5}[0-9]{4}[A-Z]{1}");
。但我不知道我的字符串将包含多少个字符和数字以及顺序。可能有人知道该怎么做吗?有什么建议吗?
我假设 PAN 是指信用卡号 (see PAN on wikipedia)。
根据那篇文章,数字的长度必须在 8 到 19 位之间。因此,您在文本中搜索具有该间隔长度的数字,存储它们并使用 Luhn algorithm 检查它们。这是一个查找长度在 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!