Java中分割字符串产生首个空元素的原因探究
为什么用
split("\\.+")分割字符串会得到首个空元素? 先重现你的场景,方便大家理解问题:
String row = ".....O.O.O"; String[] arr = row.split("\\.+"); // 执行结果:["", "O", "O", "O"]
核心原因:split()的分割逻辑
Java的String.split(regex)方法是从左到右扫描字符串,把分隔符之间的子串依次存入结果数组。当字符串以分隔符开头时,第一个分隔符组(这里是开头的多个.)的左侧没有任何字符,对应的子串就是一个空字符串"",这个空串会被作为数组的第一个元素保留下来。
举个更直观的对比例子:
- 如果字符串是
"O..O.O",用split("\\.+")得到的结果是["O", "O", "O"]——因为开头不是分隔符,第一个元素就是第一个O。 - 但你的字符串是
".....O.O.O",开头全是分隔符,所以第一个“分隔符之前的内容”就是空字符串,自然会出现在结果数组的第一位。
如何去掉开头的空元素?
如果你希望结果里没有这个空串,可以先把字符串开头的所有.去掉,再执行分割:
String row = ".....O.O.O"; // 先替换开头的所有点为空 String cleanedRow = row.replaceAll("^\\.+", ""); String[] arr = cleanedRow.split("\\.+"); // 执行结果:["O", "O", "O"]
这里的^\\.+是正则表达式,^表示匹配字符串的开头,\\.+匹配一个或多个点,把这部分替换成空就去掉了开头的分隔符。
另外补充个小细节:split()的默认行为会忽略末尾的空元素,但不会忽略开头或中间的空元素。比如如果你的字符串是"O.O.O.....",用split("\\.+")得到的结果还是["O", "O", "O"],末尾的空串会被自动去掉。
内容的提问来源于stack exchange,提问作者A. Backhagen
相关产品推荐
相关产品推荐

