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
相关产品推荐
相关产品推荐

