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

如何仅将姓氏和父称替换为星号?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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:05:17