用于确定Android中信用卡的正则表达式
这个问题在这里已经有了答案:
根据线索中的答案之一,可以根据以下数据验证卡片。
签证: ^4[0-9]{6,}$
Visa卡号码以4开头。
万事达卡: ^5[1-5][0-9]{5,}$
万事达卡号码以51到55开头,但这只会检测到万事达信用卡; 使用MasterCard系统发行的其他卡不属于此IIN范围。
美国运通: ^3[47][0-9]{5,}$
美国运通卡号码以34或37开头。
大来卡: ^3(?:0[0-5]|[68][0-9])[0-9]{4,}$
Diners Club卡号以300到305,36或38开头。大来卡以5开头,有16位数字。 这些是Diners Club和MasterCard之间的合资企业,应该像万事达卡一样处理。
发现: ^6(?:011|5[0-9]{2})[0-9]{3,}$
发现卡号以6011或65开头。
JCB: ^(?:2131|1800|35[0-9]{3})[0-9]{3,}$
JCB卡以2131,1800或35开头。
所以你需要为每个案例创建单独的模式。 你可以做如下。
ArrayList<String> listOfPattern=new ArrayList<String>();
String ptVisa = "^4[0-9]{6,}$";
listOfPattern.add(ptVisa);
String ptMasterCard = "^5[1-5][0-9]{5,}$";
listOfPattern.add(ptMasterCard);
String ptAmeExp = "^3[47][0-9]{5,}$";
listOfPattern.add(ptAmeExp);
String ptDinClb = "^3(?:0[0-5]|[68][0-9])[0-9]{4,}$";
listOfPattern.add(ptDinClb);
String ptDiscover = "^6(?:011|5[0-9]{2})[0-9]{3,}$";
listOfPattern.add(ptDiscover);
String ptJcb = "^(?:2131|1800|35[0-9]{3})[0-9]{3,}$";
listOfPattern.add(ptJcb);
}
接着,
@Override
public void afterTextChanged(Editable s) {
Log.d("DEBUG", "afterTextChanged : "+s);
String ccNum = s.toString();
for(String p:listOfPattern){
if(ccNum.matches(p)){
Log.d("DEBUG", "afterTextChanged : discover");
break;
}
}
}
对于你的最后一个问题,下面的线程可以帮助你。
在android中编辑文本格式的信用卡
编辑:
例如,如果卡号是16位数字,则在应用逻辑以在4位数后添加空格后,在处理实际卡号时需要删除这些空格。 那么只有上面的逻辑会起作用。
希望这可以帮助。
使用下列课程来验证你的卡片。
public class Validator {
public static final byte VISA = 0;
public static final byte MASTERCARD = 1;
public static final byte AMEX = 2;
public static final byte DINERS_CLUB = 3;
public static final byte CARTE_BLANCHE = 4;
public static final byte DISCOVER = 5;
public static final byte ENROUTE = 6;
public static final byte JCB = 7;
public static boolean validate(final String credCardNumber, final byte type) {
String creditCard = credCardNumber.trim();
boolean applyAlgo = false;
switch (type) {
case VISA:
// VISA credit cards has length 13 - 15
// VISA credit cards starts with prefix 4
if (creditCard.length() >= 13 && creditCard.length() <= 16
&& creditCard.startsWith("4")) {
applyAlgo = true;
}
break;
case MASTERCARD:
// MASTERCARD has length 16
// MASTER card starts with 51, 52, 53, 54 or 55
if (creditCard.length() == 16) {
int prefix = Integer.parseInt(creditCard.substring(0, 2));
if (prefix >= 51 && prefix <= 55) {
applyAlgo = true;
}
}
break;
case AMEX:
// AMEX has length 15
// AMEX has prefix 34 or 37
if (creditCard.length() == 15
&& (creditCard.startsWith("34") || creditCard
.startsWith("37"))) {
applyAlgo = true;
}
break;
case DINERS_CLUB:
case CARTE_BLANCHE:
// DINERSCLUB or CARTEBLANCHE has length 14
// DINERSCLUB or CARTEBLANCHE has prefix 300, 301, 302, 303, 304,
// 305 36 or 38
if (creditCard.length() == 14) {
int prefix = Integer.parseInt(creditCard.substring(0, 3));
if ((prefix >= 300 && prefix <= 305)
|| creditCard.startsWith("36")
|| creditCard.startsWith("38")) {
applyAlgo = true;
}
}
break;
case DISCOVER:
// DISCOVER card has length of 16
// DISCOVER card starts with 6011
if (creditCard.length() == 16 && creditCard.startsWith("6011")) {
applyAlgo = true;
}
break;
case ENROUTE:
// ENROUTE card has length of 16
// ENROUTE card starts with 2014 or 2149
if (creditCard.length() == 16
&& (creditCard.startsWith("2014") || creditCard
.startsWith("2149"))) {
applyAlgo = true;
}
break;
case JCB:
// JCB card has length of 16 or 15
// JCB card with length 16 starts with 3
// JCB card with length 15 starts with 2131 or 1800
if ((creditCard.length() == 16 && creditCard.startsWith("3"))
|| (creditCard.length() == 15 && (creditCard
.startsWith("2131") || creditCard
.startsWith("1800")))) {
applyAlgo = true;
}
break;
default:
throw new IllegalArgumentException();
}
if (applyAlgo) {
return validate(creditCard);
}
return false;
}
public static boolean validate(String creditCard) {
// 4 9 9 2 7 3 9 8 7 1 6
// 6
// 1 x 2 = 2 = (0 + 2) = 2
// 7
// 8 x 2 = 16 = (1 + 6) = 7
// 9
// 3 x 2 = 6 = (0 + 6) = 6
// 7
// 2 x 2 = 4 = (0 + 4) = 4
// 9
// 9 X 2 = 18 = (1 + 8) = 9
// 4
// 6+2+7+7+9+6+7+4+9+9+4 = 70
// return 0 == (70 % 10)
int sum = 0;
int length = creditCard.length();
for (int i = 0; i < creditCard.length(); i++) {
if (0 == (i % 2)) {
sum += creditCard.charAt(length - i - 1) - '0';
} else {
sum += sumDigits((creditCard.charAt(length - i - 1) - '0') * 2);
}
}
return 0 == (sum % 10);
}
private static int sumDigits(int i) {
return (i % 10) + (i / 10);
}
public final static boolean isValidEmail(CharSequence target) {
return !TextUtils.isEmpty(target) && android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches();
}
}
链接地址: http://www.djcxy.com/p/70701.html