核心方法:substring()
这是最直接、最常用的字符串截取方法,它位于 String 类中,有两种重载形式。

substring(int beginIndex)
从指定的索引位置开始,截取到字符串的末尾。
语法:
public String substring(int beginIndex)
参数:
beginIndex:开始截取的位置(包含此位置的字符),索引从0开始。
返回值:
一个新的 String 对象,包含从 beginIndex 到末尾的所有字符。

示例:
String str = "Hello, World!";
// 从索引 7 开始截取,包含索引 7 的字符 'W'
String sub1 = str.substring(7);
System.out.println("原字符串: " + str);
System.out.println("截取结果: " + sub1); // 输出: World!
substring(int beginIndex, int endIndex)
从指定的开始索引位置截取,到指定的结束索引位置之前结束。
语法:
public String substring(int beginIndex, int endIndex)
参数:

beginIndex:开始截取的位置(包含此位置的字符)。endIndex:结束截取的位置(不包含此位置的字符)。
返回值:
一个新的 String 对象,包含从 beginIndex 到 endIndex - 1 的所有字符。
示例:
String str = "Hello, World!";
// 从索引 7 开始,到索引 12 结束(不包含索引 12 的字符 'd')
String sub2 = str.substring(7, 12);
System.out.println("原字符串: " + str);
System.out.println("截取结果: " + sub2); // 输出: World
重要注意事项
索引越界异常 (StringIndexOutOfBoundsException)
如果你提供的 beginIndex 或 endIndex 超出了字符串的范围,程序会抛出 StringIndexOutOfBoundsException 异常。
错误示例:
String str = "Hello"; // 错误:索引 5 超出范围(字符串长度为 5,最大有效索引是 4) String sub = str.substring(5); // 抛出异常 // 错误:endIndex 大于字符串长度 String sub2 = str.substring(0, 10); // 抛出异常
字符串不可变性
String 对象在 Java 中是不可变的。substring() 方法不会修改原始字符串,而是返回一个新的字符串对象。
示例:
String original = "Java Programming";
String modified = original.substring(5, 15);
System.out.println("原始字符串: " + original); // 输出: Java Programming
System.out.println("截取后的字符串: " + modified); // 输出: Programm
System.out.println("original 的引用是否改变: " + (original == modified)); // 输出: false
可以看到,original 字符串本身并没有被改变。
其他截取方式
除了 substring(),还有一些其他方法可以实现类似的功能,尤其是在处理复杂规则时。
使用 split() 方法分割
当你想根据某个分隔符将字符串分割成多个部分,然后取其中一部分时,split() 非常方便。
语法:
public String[] split(String regex)
示例: 假设有一个格式为 "用户名:密码" 的字符串,我们想获取密码。
String userInfo = "admin:password123";
String[] parts = userInfo.split(":"); // 使用冒号作为分隔符
if (parts.length > 1) {
String username = parts[0]; // "admin"
String password = parts[1]; // "password123"
System.out.println("用户名: " + username);
System.out.println("密码: " + password);
}
使用 StringTokenizer (较旧的方式)
StringTokenizer 是一个遗留类(Legacy Class),用于将字符串分解为标记,在现代 Java 编程中,通常推荐使用 split() 方法,因为它更简单、功能更强。
示例:
import java.util.StringTokenizer;
String data = "apple,banana,orange";
StringTokenizer tokenizer = new StringTokenizer(data, ",");
while (tokenizer.hasMoreTokens()) {
String token = tokenizer.nextToken();
System.out.println("获取到: " + token);
}
// 输出:
// 获取到: apple
// 获取到: banana
// 获取到: orange
使用正则表达式 (Pattern 和 Matcher)
这是最强大、最灵活的方式,适用于非常复杂的字符串匹配和提取场景。
示例: 从一个复杂的日志行中提取 IP 地址。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
String logLine = "192.168.1.1 - - [10/Oct/2025:13:55:36 +0800] \"GET /index.html HTTP/1.1\" 200 2326";
// 定义一个匹配 IP 地址的正则表达式
String ipRegex = "\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b";
Pattern pattern = Pattern.compile(ipRegex);
Matcher matcher = pattern.matcher(logLine);
if (matcher.find()) {
// group(0) 返回整个匹配的子串
String ipAddress = matcher.group(0);
System.out.println("提取到的IP地址: " + ipAddress); // 输出: 192.168.1.1
}
总结与最佳实践
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
substring() |
最常用,根据固定的起始和结束位置截取。 | 简单、直接、性能高。 | 不适用于基于分隔符或复杂规则的截取。 |
split() |
根据一个或多个分隔符将字符串分割成数组,然后取特定部分。 | 灵活,处理分隔符很方便。 | 返回数组,如果只需要一小部分,可能会有性能开销(创建了整个数组)。 |
StringTokenizer |
将字符串分解为标记(旧版方式)。 | 功能比 split() 简单。 |
已被标记为遗留类,不推荐在新代码中使用。 |
Pattern/Matcher |
处理复杂规则的字符串匹配和提取。 | 功能最强大,极其灵活。 | 语法相对复杂,性能开销比 substring() 大。 |
推荐流程:
- 如果只是简单地从某个位置截取到另一个位置,直接使用
substring()。 - 如果字符串有固定的分隔符(如逗号、空格、冒号),并且你想获取分割后的某一部分,使用
split()。 - 如果截取规则非常复杂(匹配特定模式的数字、日期、邮箱等),使用正则表达式
Pattern和Matcher。
希望这份详细的解释能帮助你更好地理解和使用 Java 中的字符串截取功能!
