有一个未知长度的数字,我们的想法是建立一个正则表达式,匹配除最后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} $”
答案 0 :(得分:3)
您可以使用
\G\d(?=\d{4,}$)
请参阅regex demo。
<强>详情
\G
- 字符串的开头或上一场比赛的结束\d
- 数字(?=\d{4,}$)
- 一个正向前瞻,需要4个或更多数字,直到当前位置右侧的字符串末尾。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());
}
}