Java中使用正则表达式的点(.)分割字符串为何得到max=0?
问题原因分析与解决办法
这个问题其实踩了Java正则和String.split()方法的两个小坑,我来给你拆解清楚:
1. 核心问题:.是正则元字符,必须转义
Java的String.split()方法接收的参数是正则表达式,而.在正则语法里是特殊的元字符,用来匹配任意单个字符(除换行符外)。你直接写split("."),相当于告诉程序:"用任意字符作为分隔符来分割字符串"——这显然和你想要的"按实际的点字符分割"完全不是一回事。
2. 为什么会得到max=0?
当你用split(".")时,字符串里的每一个字符都会被当成分隔符,分割后的结果是一连串的空字符串(比如"abc"会被拆成["", "", "", ""])。但split()方法默认使用的是split(regex, 0)的重载形式:
- 当
limit=0时,方法会自动丢弃所有末尾的空字符串; - 如果所有分割出来的结果都是空字符串,那最终得到的就是一个长度为0的空数组。
如果你尝试打印这个数组的长度,会得到0;如果是计算数组元素的最大长度,空数组自然会返回max=0。
正确的用法示例
如果你想按实际的.字符分割字符串
必须对.进行转义:在Java字符串中,要表示正则里的.,需要写两个反斜杠\\.(第一个反斜杠是Java字符串的转义符,用来告诉编译器第二个反斜杠是正则的转义符):
String testStr = "a.b.c"; String[] result = testStr.split("\\."); // result的内容是["a", "b", "c"],长度为3
如果你想把字符串拆成单个字符
其实不需要用.来分割,直接用空字符串分割,或者转换成字符数组更高效:
// 方法1:用空字符串分割 String[] singleChars = testStr.split(""); // 方法2:转换成字符数组 char[] charArray = testStr.toCharArray();
额外补充:关于split的limit参数
如果你用split(".", -1)(limit设为-1),方法会保留所有的空字符串,比如"abc".split(".", -1)会得到长度为4的数组(四个空字符串),但每个元素都是空,所以max还是0——这显然不是你想要的结果,所以核心还是要正确转义.。
内容的提问来源于stack exchange,提问作者jack.math
相关产品推荐
相关产品推荐

