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
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/67552.html