当前位置:首页 > 后端开发 > 正文

Java如何截取字符串?

在Java中,使用 String.substring()方法截取字符串,传入起始索引(从0开始)可截取到末尾,如 str.substring(2);传入起始和结束索引则截取指定区间(含头不含尾),如 str.substring(2,5),需确保索引合法,避免越界异常。

Java字符串截取完全指南:方法与最佳实践

在Java开发中,字符串截取是最常用的基础操作之一,下面全面解析Java中各种字符串截取方法及其应用场景:

一、核心方法:substring()

substring()是Java原生字符串截取的核心方法,有两种重载形式:

// 示例字符串
String text = "Hello,Java开发者!";
// 1. 单参数截取:从指定索引到末尾
String result1 = text.substring(7); // "Java开发者!"
System.out.println(result1); 
// 2. 双参数截取:指定起止索引(含头不含尾)
String result2 = text.substring(7, 11); // "Java"
System.out.println(result2);

关键特性:

  • 索引从0开始计数(首个字符索引为0)
  • 终止索引对应的字符不包含在结果中
  • 支持中文等Unicode字符(底层基于UTF-16)

️ 二、使用注意事项

  1. 索引越界问题

    Java如何截取字符串?  第1张

    • 触发StringIndexOutOfBoundsException异常
    • 防御性代码示例:
      int start = 20;
      if(start >= 0 && start <= text.length()) {
          String sub = text.substring(start);
      } else {
          // 处理异常情况
      }
  2. 性能优化

    • JDK 7u6+版本:substring创建新字符数组(避免内存泄漏)
    • 大文本处理建议:
      new String(text.substring(start, end)) // 释放原数组引用

三、替代截取方案

方法 适用场景 示例
split() 按分隔符截取 text.split(",")[0]
正则表达式 复杂模式匹配 text.replaceAll("^.*?(Java).*", "$1")
StringUtils(Apache) 增强空安全处理 StringUtils.substring(text, 5, 9)

正则表达式场景示例:提取括号内内容

String input = "订单号(ORD-2025)";
Pattern pattern = Pattern.compile(".*?\((.*?)\)");
Matcher matcher = pattern.matcher(input);
if(matcher.find()) {
    System.out.println(matcher.group(1)); // ORD-2025
}

四、特殊编码处理

处理多字节字符(如中文)时需注意:

String chinese = "你好世界";
// 错误做法:可能截断多字节字符
String badCut = chinese.substring(0, 1); // 可能得到乱码 
// 正确方案:按字符数截取
int charCount = 2;
String safeCut = new String(chinese.toCharArray(), 0, charCount); // "你好"

️ 五、实战应用场景

  1. 文件扩展名提取

    String filename = "document.pdf";
    String ext = filename.substring(filename.lastIndexOf(".") + 1);
  2. 关键词提取

    String content = "【紧急通知】系统维护时间:2025-10-01";
    int start = content.indexOf(":") + 1;
    String date = content.substring(start); // 2025-10-01
  3. 数据脱敏处理

    String phone = "13800138000";
    String masked = phone.substring(0, 3) + "****" + phone.substring(7);
    // 138****8000

最佳实践总结

  1. 常规截取优先选用substring(),注意索引范围控制
  2. 复杂匹配考虑正则表达式,但需注意性能开销
  3. 中文等Unicode字符使用字符数组转换方式更安全
  4. 外部数据源输入务必做长度校验
  5. 超长字符串处理关注内存管理

Java字符串截取看似简单,实则涉及编码安全内存管理异常处理等专业知识点,建议在关键业务场景增加单元测试覆盖边界情况,例如空字符串、超长索引、多语言字符等,确保功能健壮性。

引用说明:本文内容基于Oracle官方Java 17文档规范,参考《Effective Java》第三版项目实践,并结合Apache Commons Lang工具库的通用设计方案总结而成。

0