You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java基于分隔符替换指定子串 解决多同值分隔符处理错乱问题

Java字符串指定位置冒号前后内容替换方案

问题核心

直接用全量split(":")处理的缺陷很明确:这个方法会把字符串中所有冒号都作为分割点,一旦目标字符串后续(比如IP段、路径段)出现其他冒号,分割后的数组长度和内容就会偏离预期,没法精准定位到//和@之间、属于认证信息段的那个目标冒号。

初始待处理字符串:

String s = "abc//jason:1234567@123.123.213.212/";

预期输出:

abc//.....:.......@123.123.213:212/

可直接落地的实现方式

方式1:正则精准匹配替换(代码最简洁)

要替换的内容固定在//和@两个标记之间,完全可以用正则直接匹配这段固定结构,一步完成替换,不用手动处理复杂分割逻辑:

public class StringReplace {
    public static void main(String[] args) {
        String s = "abc//jason:1234567@123.123.213.212/";
        // 匹配//和@之间的 任意非@字符:任意非@字符 结构,替换为指定点串
        String res = s.replaceAll("//[^@]+:[^@]+@", "//.....:.......@");
        // 对应预期输出里IP段最后一个点转冒号的要求
        int lastDotPos = res.lastIndexOf(".");
        res = res.substring(0, lastDotPos) + ":" + res.substring(lastDotPos + 1);
        System.out.println(res);
    }
}

方式2:定位标记位截取拼接(灵活性最高)

如果后续需要根据原用户名、密码的长度动态生成对应数量的占位符,推荐用这种方式,先锁定要处理的区间,完全不受区间外其他冒号、特殊字符的影响:

public class StringReplace {
    public static void main(String[] args) {
        String s = "abc//jason:1234567@123.123.213.212/";
        // 先定位关键标记的索引
        int doubleSlashPos = s.indexOf("//");
        int atPos = s.indexOf("@");
        // 拼接前缀、替换后的认证段、后缀
        StringBuilder sb = new StringBuilder();
        sb.append(s, 0, doubleSlashPos + 2)
          .append(".....:.......")
          .append(s, atPos, s.length());
        // 处理IP段最后一个点转冒号的要求
        int lastDotPos = sb.lastIndexOf(".");
        sb.setCharAt(lastDotPos, ':');
        System.out.println(sb);
    }
}

不推荐直接用split的原因

就算给split加limit参数写成s.split(":", 2),也只能按字符串里第一个出现的冒号分割,一旦//之前的路径里出现冒号,分割位置就会错,鲁棒性远不如上面两种先锁定目标区间的实现。


内容的提问来源于stack exchange,提问作者dsknjksad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 01:42:22