正则表达式匹配除最后4位数之外的所有未知长度的数字

时间:2017-12-06 23:12:12

标签: regex

有一个未知长度的数字,我们的想法是建立一个正则表达式,匹配除最后4位数之外的所有数字。

我已经尝试了很多但是没有运气。

目前我有这个正则表达式:“^(\ d *)\ d {0} \ d {0} \ d {0} \ d {0}。* $”

输入:123456789089775

预期输出:XXXXXXXXXXX9775

我使用如下(这不起作用):

String accountNumber ="123456789089775";
String pattern = "^(\\d*)\\d{1}\\d{1}\\d{1}\\d{1}.*$";
String result = accountNumber.replaceAll(pattern, "X");

请建议我应该如何解决这个问题或给我解决方案。 在这种情况下,我的全部意义是否定正则表达式:“\ d {4} $”

3 个答案:

答案 0 :(得分:3)

您可以使用

\G\d(?=\d{4,}$)

请参阅regex demo

<强>详情

  • \G - 字符串的开头或上一场比赛的结束
  • \d - 数字
  • (?=\d{4,}$) - 一个正向前瞻,需要4个或更多数字,直到当前位置右侧的字符串末尾。

Java demo

String accountNumber ="123456789089775";
String pattern = "\\G\\d(?=\\d{4,}$)"; // Or \\G.(?=.{4,}$)
String result = accountNumber.replaceAll(pattern, "X");
System.out.println(result); // => XXXXXXXXXXX9775

答案 1 :(得分:2)

尝试:

String pattern = "^(.*)[0-9]{4}$";

评论后的附录:仅匹配完整数字的重构可能如下所示:

String pattern = "^([0-9]+)[0-9]{4}$";

答案 2 :(得分:2)

仍然不允许发表评论,因为我还没有那个“50代表”,但DDeMartini的答案会吞下前缀非数字帐户,因为“^(。*)”会匹配像abcdef1234这样的东西 - 坚持你的\ d-语法

"^(\\d+)(\\d{4}$)"

似乎工作正常,需要数字(最小长度为6个字符)。测试就像

public class AccountNumberPadder {

    private static final Pattern LAST_FOUR_DIGITS = Pattern.compile("^(\\d+)(\\d{4})");

    public static void main(String[] args) {
        String[] accountNumbers = new String[] { "123456789089775", "999775", "1234567890897" };
        for (String accountNumber : accountNumbers) {
            Matcher m = LAST_FOUR_DIGITS.matcher(accountNumber);
            if (m.find()) {
                System.out.println(paddIt(accountNumber, m));
            } else {
                throw new RuntimeException(String.format("Whooaaa - don't work for %s", accountNumber));
            }
        }
    }

    public static String paddIt(String input, Matcher m) {
        StringBuilder b = new StringBuilder();
        for (int i = 0; i < m.group(1).length(); i++) {
            b.append("X");
        }
       return input.replace(m.group(1), b.toString());
    }
}