杰瑞科技汇

Java字符串如何高效截取指定字符?

核心方法:substring()

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

Java字符串如何高效截取指定字符?-图1
(图片来源网络,侵删)

substring(int beginIndex)

从指定的索引位置开始,截取到字符串的末尾。

语法: public String substring(int beginIndex)

参数:

  • beginIndex:开始截取的位置(包含此位置的字符),索引从 0 开始。

返回值: 一个新的 String 对象,包含从 beginIndex 到末尾的所有字符。

Java字符串如何高效截取指定字符?-图2
(图片来源网络,侵删)

示例:

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)

参数:

Java字符串如何高效截取指定字符?-图3
(图片来源网络,侵删)
  • beginIndex:开始截取的位置(包含此位置的字符)。
  • endIndex:结束截取的位置(不包含此位置的字符)。

返回值: 一个新的 String 对象,包含从 beginIndexendIndex - 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)

如果你提供的 beginIndexendIndex 超出了字符串的范围,程序会抛出 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

使用正则表达式 (PatternMatcher)

这是最强大、最灵活的方式,适用于非常复杂的字符串匹配和提取场景。

示例: 从一个复杂的日志行中提取 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() 大。

推荐流程:

  1. 如果只是简单地从某个位置截取到另一个位置,直接使用 substring()
  2. 如果字符串有固定的分隔符(如逗号、空格、冒号),并且你想获取分割后的某一部分,使用 split()
  3. 如果截取规则非常复杂(匹配特定模式的数字、日期、邮箱等),使用正则表达式 PatternMatcher

希望这份详细的解释能帮助你更好地理解和使用 Java 中的字符串截取功能!

分享:
扫描分享到社交APP
上一篇
下一篇