Java正则表达式-掩码信用卡号
我有一个在字符串中屏蔽信用卡号码的功能:Java正则表达式-掩码信用卡号,java,regex,string,Java,Regex,String,我有一个在字符串中屏蔽信用卡号码的功能: public static String replaceCreditCardNumber(String text){ final String MASKCARD = "$1<MASKED>$2"; final Pattern PATTERNCARD = Pattern.compile("([0-9]{4})[0-9]{0,9}([0-9]{4})");
public static String replaceCreditCardNumber(String text){
final String MASKCARD = "$1<MASKED>$2";
final Pattern PATTERNCARD =
Pattern.compile("([0-9]{4})[0-9]{0,9}([0-9]{4})");
Matcher matcher = PATTERNCARD.matcher(text);
if (matcher.find()) {
return matcher.replaceAll(MASKCARD);
}
return text;
}
我要走了
aaa=1gfg23fgfg4567[<MASKED>]3456
aaa=1GFG23FG4567[]3456
我的正则表达式缺少什么?基于示例:
Pattern.compile("([0-9]{4})[0-9]{8}([0-9]{4})");
您应该使用单词边界来确保避免匹配不需要的输入:
final Pattern PATTERNCARD =
Pattern.compile("\\b([0-9]{4})[0-9]{0,9}([0-9]{4})\\b");
我希望为您服务 我有以下课程:
public class PatternCreditCard {
// ------------------------- PATTERN DEFINE TYPE CREDIT --------------------------- //
public static final String VISA = "^4.*";
public static final String VISA_ELECTRON = "^(4026|417500|4508|4844|491(3|7)).*";
public static final String MASTER_CARD = "^5[1-5].*";
public static final String AMEX = "^3[47].*";
public static final String DISCOVER =
"^(6011|622(12[6-9]|1[3-9][0-9]|[2-8][0-9]{2}|9[0-1][0-9]|92[0-5]|64[4-9])|65).*";
public static final String DINERS = "^36.*";
public static final String DINERS_CARTE_BLANCHE = "^30[0-5].*";
public static final String JCB = "^35(2[89]|[3-8][0-9]).*";
// ------------------------- PATTERN SEPARATOR GROUP NUMBERS --------------------------- //
public static final String VISA_SEPARATOR =
"^([0-9 ]{5})([0-9 ]{5})?([0-9 ]{5})?(?:([0-9 ]{5})([0-9 ]{5})?([0-9]{5})([0-9]{4}))?$";
public static final String MASTER_CARD_SEPARATOR =
"^([0-9 ]{5})([0-9 ]{5})?([0-9 ]{5})?(?:([0-9 ]{5})([0-9 ]{5})?([0-9]{5})([0-9]{4}))?$";
public static final String AMEX_SEPARATOR =
"^([0-9 ]{5})([ ]?[0-9 ]{7})?(?:([ ]?[0-9 ]{7})([ ]?[0-9]{5}))?$";
public static final String DISCOVER_SEPARATOR =
"^([0-9 ]{5})([0-9 ]{5})?([0-9 ]{5})?(?:([0-9 ]{5})([0-9 ]{5})?([0-9]{5})([0-9]{4}))?$";
// ------------------------- LENGTH PERMITTED FOR CREDIT CARD --------------------------- //
public static final int VISA_LEN = 16;
public static final int MASTER_CARD_LEN = 16;
public static final int AMEX_LEN = 15;
public static final int DISCOVER_LEN = 16;
}
然后,如果返回值为“”(空),则替换信用卡号的字符串:表示该字符串符合正则表达式中的任何组
cardNumber.replaceAll(VISA_SEPARATOR, " ");
为什么中间有<代码> [09] {0},9} < /代码>?信用卡号码不是总是16位数吗?你要的是4位数,然后是9位数,再加上4位数——这就是“失败”案例中的情况。因此,中间的5位数字被替换。你需要有8个数字才能被屏蔽吗?@Keppli-不是真的-他们也可以有14个(食客俱乐部)或15个(美国运通)。有些签证甚至有13张。是一个资源,其中包括对信用卡/借记卡的一些建议regexes@Vld:好的,那么
[0-9]{5,8}
可能更有意义。
public class PatternCreditCard {
// ------------------------- PATTERN DEFINE TYPE CREDIT --------------------------- //
public static final String VISA = "^4.*";
public static final String VISA_ELECTRON = "^(4026|417500|4508|4844|491(3|7)).*";
public static final String MASTER_CARD = "^5[1-5].*";
public static final String AMEX = "^3[47].*";
public static final String DISCOVER =
"^(6011|622(12[6-9]|1[3-9][0-9]|[2-8][0-9]{2}|9[0-1][0-9]|92[0-5]|64[4-9])|65).*";
public static final String DINERS = "^36.*";
public static final String DINERS_CARTE_BLANCHE = "^30[0-5].*";
public static final String JCB = "^35(2[89]|[3-8][0-9]).*";
// ------------------------- PATTERN SEPARATOR GROUP NUMBERS --------------------------- //
public static final String VISA_SEPARATOR =
"^([0-9 ]{5})([0-9 ]{5})?([0-9 ]{5})?(?:([0-9 ]{5})([0-9 ]{5})?([0-9]{5})([0-9]{4}))?$";
public static final String MASTER_CARD_SEPARATOR =
"^([0-9 ]{5})([0-9 ]{5})?([0-9 ]{5})?(?:([0-9 ]{5})([0-9 ]{5})?([0-9]{5})([0-9]{4}))?$";
public static final String AMEX_SEPARATOR =
"^([0-9 ]{5})([ ]?[0-9 ]{7})?(?:([ ]?[0-9 ]{7})([ ]?[0-9]{5}))?$";
public static final String DISCOVER_SEPARATOR =
"^([0-9 ]{5})([0-9 ]{5})?([0-9 ]{5})?(?:([0-9 ]{5})([0-9 ]{5})?([0-9]{5})([0-9]{4}))?$";
// ------------------------- LENGTH PERMITTED FOR CREDIT CARD --------------------------- //
public static final int VISA_LEN = 16;
public static final int MASTER_CARD_LEN = 16;
public static final int AMEX_LEN = 15;
public static final int DISCOVER_LEN = 16;
}
cardNumber.replaceAll(VISA_SEPARATOR, " ");