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

