Java中如何将正则匹配的子串替换为等长度的重复'.'字符
问题根因
Java 语法本身不支持字符串与整数做乘法运算生成重复字符序列,你代码里"." * matcher.group(1).length()的写法不符合Java语法规则,因此会触发报错。另外直接把匹配到的子串作为replaceAll的正则参数,遇到子串包含正则元字符(比如*、+、?)时还会出现匹配逻辑错误。
修复方案
根据你使用的Java版本,选对应方式生成等长度的.替换串即可。
方案1:Java 11 及以上版本(最简洁)
直接调用JDK内置的String.repeat(int count)方法生成指定长度的重复字符串,注意对匹配到的子串做正则转义:
String target = matcher.group(1); // Pattern.quote 用于转义匹配子串中的正则特殊字符,避免匹配异常 s = s.replaceAll(Pattern.quote(target), ".".repeat(target.length()));
方案2:兼容Java 8及以下低版本
通过字符数组初始化的方式快速生成等长度.串,不需要手动写循环拼接:
String target = matcher.group(1); int len = target.length(); // 初始化长度为len的空字符数组,替换所有空字符为.即可得到等长点串 String replaceStr = new String(new char[len]).replace('\0', '.'); s = s.replaceAll(Pattern.quote(target), replaceStr);
更高效的批量替换写法
如果是在循环遍历匹配结果的场景下替换,推荐用Matcher原生的替换拼接方法,避免每次调用replaceAll全量扫描字符串,性能更好:
StringBuffer sb = new StringBuffer(); // 假设已经完成pattern初始化、matcher绑定原字符串 while (matcher.find()) { String matchContent = matcher.group(1); // 生成对应长度的替换点串,低版本替换为字符数组实现即可 String dots = ".".repeat(matchContent.length()); // Matcher.quoteReplacement 用于转义替换串中的$、\特殊字符,避免替换报错 matcher.appendReplacement(sb, Matcher.quoteReplacement(dots)); } matcher.appendTail(sb); s = sb.toString();
注意事项
- 所有传入
replaceAll/replaceFirst第一个参数的动态字符串,都要用Pattern.quote()转义,否则会被当作正则表达式解析 - 所有传入追加替换方法的动态替换串,都要用
Matcher.quoteReplacement()转义,避免字符串中的特殊字符被识别成分组引用符号触发异常
内容的提问来源于stack exchange,提问作者KKir
相关产品推荐
相关产品推荐

