在java中检查连续的13位数

时间:2014-03-13 06:10:35

标签: java

大家好我正在使用以下函数来检查java中的连续数字

我面临的问题是它仅适用于第一个连续数字

例如适用于 123456789123456XXXX 但希望这个连续工作在任何地方 XXXX123456789123456 XX123456789123456XX

更新

现在,如果我找到13个连续数字,那么我需要将所有连续数字传递给掩码函数

我的结果应该是 像这样的东西

输入 123456789123456XXXX 结果应为 123456 %%%%% 3456XXXX

输入 XXXX123456789123456 结果应为 XX123456 %%%%% 3456XX

请帮我解决这个问题

我的代码

public void checkPosCardNoAndMask(String cardNo) {
    String maskNumber = "";
    String starValue = "";
    boolean isConsecutive = false;
    int checkConsecutive = 0;
    for (int i = 0, len = cardNo.length(); i < len; i++) {
        if (Character.isDigit(cardNo.charAt(i))) {
            maskNumber = maskNumber + cardNo.charAt(i);
        } else {
            if (checkConsecutive >= 13)
                isConsecutive = true;
            else
                break;
            starValue = starValue + cardNo.charAt(i);
        }
        checkConsecutive++;
    }
    if (isConsecutive)
    {
     cardNo = maskCCNumber(maskNumber) + starValue;
     System.out.printIn("Consecutive found!!:"+cardNo);
    }
    else
    {
     System.out.printIn("Consecutive not found!!:"+cardNo);
    }

} 

屏蔽逻辑

public String maskCCNumber(String ccNo)
    {
        String maskCCNo = "";
        for (int i = 0; i < ccNo.length(); i++)
        {
            if (i > 5 && i < ccNo.length() - 4)
            {
                maskCCNo = maskCCNo + '%';
            }
            else
            {
                maskCCNo = maskCCNo + ccNo.charAt(i);
            }
        }
        return maskCCNo;
    }

6 个答案:

答案 0 :(得分:5)

使用regex,您可以这样做:

  String str = "XX123456789123456XX";
    if (str.matches(".*\\d{13}.*")) {
        System.out.println(true);
        Pattern compile = Pattern.compile("\\d+");
        Matcher matcher = compile.matcher(str);
        matcher.find();
        String masked = maskCCNumber(matcher.group());//send 123456789123456 and returns 123456%%%%%3456
        String finalString=str.replaceAll("\\d+", masked);// replace all digits with 123456%%%%%3456
        System.out.println(finalString);

    }

输出:

true 
XX123456%%%%%3456XX

答案 1 :(得分:1)

几乎没有问题:

  • 当您第一次找到非数字字符时,您正在突破else。这将跳过之后的任何连续数字。所以,你不应该break
  • 事实上,一旦找到13个连续数字,就应该将break添加到循环中。
  • 您并不是在寻找连续数字,而只是寻找非连续数字的总数。至少没有break的当前逻辑将以这种方式工作。当您找到非数字字符时,应将checkConsecutive变量重置为0

因此,将for循环更改为此功能将起作用:

for (int i = 0, len = cardNo.length(); i < len; i++)
{
    if (Character.isDigit(cardNo.charAt(i))) {
        checkConsecutive++;

    } else if (checkConsecutive == 13) {
        isConsecutive = true;
        break;

    } else {
        checkConsecutive = 0;
    }
}

当然我不知道starValuemaskValue是什么,所以我删除了它。您可以适当添加它。


顺便说一下,这个问题也可以用正则表达式来解决:

if (cardNo.matches(".*\\d{13}.*")) {
    System.out.println("13 consecutive digits found");
}

答案 2 :(得分:0)

试试这个

public static void checkPosCardNoAndMask(String cardNo) {
    int n = 1;
    char c1 = cardNo.charAt(0);
    for (int i = 1, len = cardNo.length(); i < len && n < 13; i++) {
        char c2 = cardNo.charAt(i);
        if (c2 >= '1' && c2 <= '9' && (c2 - c1 == 1 || c2 == '1' && c1 == '9')) {
            n++;
        } else {
            n = 0;
        }
        c1 = c2;
    }
    if (n == 13) {
        System.out.println("Consecutive found!!");
    } else {
        System.out.println("Consecutive not found!!");
    }
}

答案 3 :(得分:0)

试试这个

public void checkPosCardNoAndMask(String cardNo) {
        if (cardNo.matches("[0-9]{13,}")) {
            System.out.println("Consecutive found!!");
        } else {
            System.out.println("Consecutive not found!!");
        }    
    }

答案 4 :(得分:0)

如果您想使用代码,请进行一次更改

public void checkPosCardNoAndMask(String cardNo) {
    String maskNumber = "";
    String starValue = "";
    boolean isConsecutive = false;
    int checkConsecutive = 0;
    for (int i = 0, len = cardNo.length(); i < len; i++) {
        if (Character.isDigit(cardNo.charAt(i))) {
            maskNumber = maskNumber + cardNo.charAt(i);
            checkConsecutive++;
        } else {
            if (checkConsecutive >= 13)
                {isConsecutive = true;break;}
            else
                checkConsecutive=0;
            starValue = starValue + cardNo.charAt(i);
        }

    }
    if (isConsecutive) {
        System.out.printIn("Consecutive found!!");
    } else {
        System.out.printIn("Consecutive not found!!");
    }

} 

答案 5 :(得分:0)

我的理解是你要掩盖字符串中的卡号。 StringUtils

的代码http://commons.apache.org/proper/commons-lang/中有一个外部依赖项
/**
 * Returns safe string for cardNumber, will replace any set of 13-16 digit
 * numbers in the string with safe card number.
 */
public static String getSafeString(String str) {

    Pattern CARDNUMBER_PATTERN = Pattern.compile("\\d{13,16}+");
    Matcher matcher = CARDNUMBER_PATTERN.matcher(str);
    while (matcher.find()) {
        String cardNumber = matcher.group();
        if (isValidLuhn(cardNumber)) {
            str = StringUtils.replace(str, cardNumber, getSafeCardNumber(cardNumber));
        }
    }
    return str;
}

public static boolean isValidLuhn(String cardNumber) {

    if (cardNumber == null || !cardNumber.matches("\\d+")) {
        return false;
    }
    int sum = 0;
    boolean alternate = false;
    for (int i = cardNumber.length() - 1; i >= 0; i--) {
        int n = Integer.parseInt(cardNumber.substring(i, i + 1));
        if (alternate) {
            n *= 2;
            if (n > 9) {
                n = (n % 10) + 1;
            }
        }
        sum += n;
        alternate = !alternate;
    }
    return (sum % 10 == 0);
}

/**
 * Returns safe string for cardNumber, will keep first six and last four
 * digits.
 */ 
public static String getSafeCardNumber(String cardNumber) {

    StringBuilder sb = new StringBuilder();
    int cardlen = cardNumber.length();
    if (cardNumber != null) {
        sb.append(cardNumber.substring(0, 6)).append(StringUtils.repeat("%", cardlen - 10)).append(cardNumber.substring(cardlen - 4));
    }
    return sb.toString();
}