如何仅将姓氏和父称替换为星号?Java字符串替换问题
解决Java字符串仅替换姓氏和父称中间字符的问题
你的核心需求是只对字符串中的第二个(姓氏)和第三个(父称)单词替换中间字符为星号,保留第一个单词(名)和每个目标单词的首尾字符。原代码用\B.\B会匹配所有单词的非边界字符,导致第一个单词也被修改,这里提供两种可行方案:
方案1:拆分-处理-拼接(兼容所有Java版本)
通过将字符串拆分为三个部分,单独处理姓氏和父称,再拼接结果:
public class StringMaskExample { public static void main(String[] args) { String s = "name surname patname"; // 按空格拆分,确保分成3个部分(避免多空格干扰) String[] parts = s.split(" ", 3); // 处理姓氏和父称的中间字符 parts[1] = maskMiddle(parts[1]); parts[2] = maskMiddle(parts[2]); // 拼接回结果字符串 String result = String.join(" ", parts); System.out.println(result); // 输出:name s*****e p*****e } // 单个单词的中间字符替换逻辑 private static String maskMiddle(String word) { // 单词长度<=2时直接返回,无需替换 if (word.length() <= 2) { return word; } // 保留首尾字符,中间填充对应数量的星号 return word.charAt(0) + "*".repeat(word.length() - 2) + word.charAt(word.length() - 1); } }
方案2:正则匹配+回调替换(Java 9+适用)
利用正则分组匹配三个单词,通过回调函数针对性处理目标分组:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMaskExample { public static void main(String[] args) { String s = "name surname patname"; Pattern pattern = Pattern.compile("(\\S+) (\\S+) (\\S+)"); Matcher matcher = pattern.matcher(s); String result = matcher.replaceAll(matchResult -> { // 第一个分组保留原样,第二、第三个分组调用替换方法 return matchResult.group(1) + " " + maskMiddle(matchResult.group(2)) + " " + maskMiddle(matchResult.group(3)); }); System.out.println(result); // 输出:name s*****e p*****e } private static String maskMiddle(String word) { if (word.length() <= 2) { return word; } return word.charAt(0) + "*".repeat(word.length() - 2) + word.charAt(word.length() - 1); } }
原代码问题说明
\B.\B匹配的是所有非单词边界的字符,也就是说只要字符不在单词的开头或结尾,都会被替换。这就导致第一个单词"name"的中间两个字符也被替换成星号,出现n**e的不符合预期的结果。
内容的提问来源于stack exchange,提问作者wildfireshtc
相关产品推荐
相关产品推荐

