上一篇                     
               
			  子串怎么得到 java
- 后端开发
- 2025-07-18
- 2185
 在Java中,可利用
 
 
substring()方法获取子串,支持单参数(起始索引)或双参数(起始/结束索引)形式,需确保索引合法
在Java中,获取子串的操作主要通过String类的原生方法实现,同时也可结合正则表达式、字符串分割等技术,以下是详细的实现方式与应用场景分析:
substring()方法的核心用法
 
substring()是Java中获取子串的最直接方法,提供两种重载形式:
| 方法签名 | 功能描述 | 
|---|---|
| substring(int beginIndex) | 从 beginIndex开始到字符串末尾的子串(包含beginIndex位置的字符)。 | 
| substring(int beginIndex, int endIndex) | 从 beginIndex开始到endIndex之前的子串(包含beginIndex,不包含endIndex)。 | 
示例1:固定索引截取
String str = "Hello, world!"; String result = str.substring(7, 12); // 结果:"world"
关键点:
- 索引从0开始计数
- endIndex为独占边界(不包含)
- 若beginIndex或endIndex超出范围,会抛出StringIndexOutOfBoundsException
示例2:动态截取到末尾
String str = "Java Programming"; String result = str.substring(5); // 结果:"Programming"
结合其他方法实现动态截取
实际场景中,子串的起始/结束位置常通过计算动态获取,需结合以下方法:
indexOf()与lastIndexOf()定位关键字符
 
用于查找特定字符或子串的位置,进而确定截取范围。

示例:提取路径中的文件名
String path = "/usr/local/bin/test.txt";
int lastSlash = path.lastIndexOf('/');
String fileName = path.substring(lastSlash + 1); // 结果:"test.txt" 
特殊处理:
- 若未找到目标字符,indexOf()返回-1,需避免-1 + 1导致意外结果
- 处理多关键字时,可组合使用indexOf()和substring()
split()分割后取片段
 
通过分隔符拆分字符串,再选取目标片段。
示例:提取URL参数
String url = "https://example.com?id=123&name=test";
String[] parts = url.split("\?"); // 按问号分割
String query = parts[1]; // 取参数部分 
正则表达式匹配
适用于复杂模式匹配,如提取数字、日期等。

示例:提取字符串中的数字
String str = "Order NO.2023-12345";
Pattern pattern = Pattern.compile("\d+");
Matcher matcher = pattern.matcher(str);
if (matcher.find()) {
    String number = matcher.group(); // 结果:"2023"
} 
第三方工具类的扩展
Apache Commons Lang的StringUtils提供了更丰富的截取方法:
| 方法 | 功能说明 | 
|---|---|
| substringBefore(String str, String separator) | 截取分隔符之前的子串。 | 
| substringAfter(String str, String separator) | 截取分隔符之后的子串。 | 
| substringBetween(String str, String tag) | 截取两组相同标签之间的内容。 | 
示例:提取XML标签内容
String xml = "<name>John</name>"; String content = StringUtils.substringBetween(xml, "<name>", "</name>"); // 结果:"John"
注意事项与性能优化
-  索引边界检查: - 使用Math.min()限制最大索引值,避免越界异常
- 处理负数索引时,可手动转换为正向索引(需注意逻辑合理性)
 
- 使用
-  性能考量:  - substring()时间复杂度为O(n),会创建新字符串对象
- 频繁截取时,建议复用临时变量减少对象创建
 
-  不可变性特性: - substring()返回的新字符串,原字符串保持不变
- 需注意链式操作中的对象引用问题
 
实战场景对比
| 需求场景 | 推荐方法 | 代码示例 | 
|---|---|---|
| 固定位置截取 | substring(int, int) | str.substring(2, 5) | 
| 动态关键词截取 | indexOf() + substring() | str.substring(str.indexOf("start") + "start".length()) | 
| 多条件组合截取 | 正则表达式 | Pattern.compile("#(.?)#").matcher(str).group(1) | 
| 按分隔符切分后取片段 | split() | String[] parts = str.split(","); String first = parts[0] | 
FAQs
Q1:substring()与subSequence()有什么区别?
A1:substring()专用于String类,返回新的String对象;subSequence()是CharSequence接口方法,返回CharSequence类型,需强制转换为String。
StringBuilder sb = new StringBuilder("abc");
CharSequence cs = sb.subSequence(1, 2); // 结果:"b" 
Q2:如何处理可能为null的字符串截取?
A2:需先进行非空判断,避免NullPointerException:
String safeSubstring(String str, int start, int end) {
    if (str == null) return "";
    return str.substring(start, end 
 
  
			