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

Java如何删除字符串中第二个@指定字符之后的所有内容

Java 删除userId第二个@之后内容的最优实现

你当前的实现存在逻辑错误,indexOf("@")只会匹配到邮箱部分的第一个@,截取后会丢失邮箱域名,完全不符合需求。

由于邮箱本身的RFC规范要求只能包含1个@,因此你的userId字符串中第二个@必然是整个字符串的最后一个@,直接使用lastIndexOf定位后截取是性能、可读性最优的方案:

// 原始userId
String originalUserId = "analitics@gmail.com@5";
// 定位第二个@的下标(即最后一个@)
int lastAtIdx = originalUserId.lastIndexOf('@');
// 截取到第二个@的位置,追加新数字后传入方法
String processedUserId = originalUserId.substring(0, lastAtIdx + 1) + 3;
userService.getUser(processedUserId);

生产环境建议增加格式校验,提前捕获非法输入:

String originalUserId = "analitics@gmail.com@5";
int firstAtIdx = originalUserId.indexOf('@');
int lastAtIdx = originalUserId.lastIndexOf('@');

// 校验是否存在至少两个@
if (firstAtIdx == -1 || lastAtIdx == firstAtIdx) {
    throw new IllegalArgumentException("userId格式非法,缺少第二个@");
}

String processedUserId = originalUserId.substring(0, lastAtIdx + 1) + 3;
userService.getUser(processedUserId);

如果你的业务场景存在userId包含3个及以上@的特殊情况,需要精确定位第二个@的位置,可以用以下实现:

String originalUserId = "analitics@gmail.com@5";
int atCount = 0;
int secondAtIdx = -1;

// 遍历查找第二个@的位置
for (int i = 0; i < originalUserId.length(); i++) {
    if (originalUserId.charAt(i) == '@') {
        atCount++;
        if (atCount == 2) {
            secondAtIdx = i;
            break;
        }
    }
}

if (secondAtIdx == -1) {
    throw new IllegalArgumentException("userId格式非法,缺少第二个@");
}

String processedUserId = originalUserId.substring(0, secondAtIdx + 1) + 3;
userService.getUser(processedUserId);

方案优势

  • 性能最高:lastIndexOf和字符遍历都是JDK优化过的原生操作,没有正则匹配、字符串拆分的额外开销,内存占用最低
  • 可读性强:逻辑直白,无需额外注释即可理解业务意图
  • 鲁棒性好:增加格式校验后可提前拦截非法输入,避免线上运行时异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:24:04