在Java开发中,字符串格式化是高频操作,其中每隔N个字符插入空格的需求十分常见,比如格式化手机号、身份证号等固定长度的字符串。下面我们就来详细讲解几种实现方式。

基础循环实现方式
最直观的实现思路是遍历字符串的每个字符,用计数器记录当前已经处理的字符数量,当计数器达到N时,先插入空格再继续拼接字符,同时要注意处理最后一段不足N个字符的情况。
public class StringInsertSpace {
public static String insertSpaceEveryN(String origin, int n) {
// 参数校验,避免空指针和无效间隔
if (origin == null || n <= 0) {
return origin;
}
StringBuilder result = new StringBuilder();
int count = 0;
for (int i = 0; i < origin.length(); i++) {
result.append(origin.charAt(i));
count++;
// 达到N个字符且不是最后一个字符时插入空格
if (count == n && i != origin.length() - 1) {
result.append(" ");
count = 0;
}
}
return result.toString();
}
public static void main(String[] args) {
String test = "1234567890";
System.out.println(insertSpaceEveryN(test, 3)); // 输出 123 456 789 0
}
}使用正则表达式实现
除了循环遍历,我们还可以借助正则表达式的替换功能来实现,代码会更加简洁,适合对正则熟悉的使用者。
public class StringInsertSpaceRegex {
public static String insertSpaceEveryN(String origin, int n) {
if (origin == null || n <= 0) {
return origin;
}
// 正则匹配每N个字符为一组,替换为组内容加空格
String regex = "(?<=\\G.{" + n + "})";
return origin.replaceAll(regex, " ");
}
public static void main(String[] args) {
String test = "abcdefghij";
System.out.println(insertSpaceEveryN(test, 4)); // 输出 abcd efgh ij
}
}两种方式的对比
下面我们从几个维度对比两种实现方式的优劣,方便大家根据实际场景选择:
| 实现方式 | 代码复杂度 | 执行效率 | 可读性 |
|---|---|---|---|
| 循环遍历 | 中等 | 高 | 好,逻辑直观 |
| 正则表达式 | 低 | 略低 | 一般,需要了解正则语法 |
注意事项
- 调用方法前一定要校验传入的
n值,避免传入0或者负数导致逻辑异常 - 如果原字符串可能包含空格,需要先明确需求,是保留原有空格还是先清除再处理
- 处理超长字符串时,优先使用
StringBuilder拼接,避免频繁的字符串创建消耗性能