Java截取字符串首选substring(按索引)和split(按正则),前者需防越界,后者需转义特殊字符;按位置取用substring,按结构拆用split。

Java中截取字符串主要靠substring和split两个方法,前者按位置切,后者按规则分,用错场景容易出空指针或越界异常。
substring:按索引精准截取子串
substring有两个重载形式:substring(int beginIndex)从指定位置到末尾;substring(int beginIndex, int endIndex)截取左闭右开区间(包含起始、不包含结束)。注意索引从0开始,且endIndex不能超过字符串长度,否则抛StringIndexOutOfBoundsException。
- 安全写法:截取前先检查长度,比如
str.length() >= 5 ? str.substring(0, 5) : str - 常见误区:误以为
substring(2, 2)会返回空字符串——它确实返回空串,但不是错误;而substring(3, 2)会直接报错 - 中文或emoji字符不影响索引计算,因为Java String底层是UTF-16,一个emoji可能占两个char,但
substring仍按char位置操作
split:用正则表达式分割字符串
split(String regex)按匹配正则的分隔符切分,返回字符串数组。默认会忽略末尾空串(如"a,b,".split(",")结果是["a","b"]),加负数参数可保留:split(",", -1)返回["a","b",""]。
- 特殊字符要转义:点号
.、星号*、问号?等在正则中有含义,写成"\."或"\*" - 想按竖线
|分割?得写"\|",因为|是正则的“或”操作符 - 多个连续分隔符会被当作一个处理,比如
"a,,b".split(",")结果是["a","","b"],不是["a","b"]
选哪个?看需求本质
要按固定位置拿内容(比如取身份证前6位),用substring;要按结构拆解(比如解析CSV、URL参数、日志字段),优先用split。如果分隔符不固定或含逻辑(如“第一个冒号之后的所有内容”),可组合使用:先indexOf找位置,再substring截取。
立即学习“Java免费学习笔记(深入)”;
- 提取邮箱用户名:
email.substring(0, email.indexOf("@")) - 按空格分词但保留连续空格?
split("(?这种零宽断言更合适,而非普通<code>split(" ") - 简单场景别硬套正则:只按单字符分隔,且该字符无正则含义,就直接用
split("\|"),别写split("[|]")增加理解成本
避坑提醒
两者都对null输入敏感:null.substring()和null.split()都会抛NullPointerException。生产代码务必先判空,推荐用Objects.requireNonNull(str, "str must not be null")或Apache Commons Lang的StringUtils.substring/StringUtils.split,它们自动处理null和空串。
-
substring传负数起始索引会立即报错,但split传null正则也会报错,不是静默失败 - 性能上,
substring在Java 7u6以后不再共享底层数组,每次调用都是新对象;split涉及正则编译,高频调用建议预编译Pattern复用 - 不确定输入格式时,别假设
split一定返回非空数组——记得检查result.length > 0


















