Answers:
"cat".split("(?!^)")
这将产生
数组[“ c”,“ a”,“ t”]
(?!
... )
是否定断言的正则表达式语法–它断言其中的内容不匹配。并且^
匹配字符串的开头,因此正则表达式在不是字符串开头的每个位置都匹配,并在其中插入一个分割符。此正则表达式也匹配字符串的末尾,因此也将空字符串附加到结果中,除非String.split
文档中说 “结果数组中不包含跟踪空字符串”。
String.split
略有变化,因此零宽度匹配产生的前导空字符串也不会包含在结果数组中,因此(?!^)
断言位置不是字符串的开头就变得不必要了,从而允许正则表达式执行以下操作:可以简化为"cat".split("")
-–但在Java 7及更低版本中,它将在结果数组中产生一个前导空字符串。
"cat".toCharArray()
但是如果你需要琴弦
"cat".split("")
编辑:将返回一个空的第一个值。
.toCharArray()
仍然应该使用;它避免使用正则表达式并返回char
原始数组,因此它更快,更轻便。需要一个1个字符的字符串数组很奇怪。
将字符串转换为一个单字符字符串数组的有效方法是:
String[] res = new String[str.length()];
for (int i = 0; i < str.length(); i++) {
res[i] = Character.toString(str.charAt(i));
}
但是,这没有考虑到a char
中的a String
实际上可以代表Unicode代码点的一半的事实。(如果代码点不在BMP中。)要解决这个问题,您需要遍历代码点...这更加复杂。
这种方法将比使用更快String.split(/* clever regex*/)
,并且可能比使用Java 8+流更快。它可能比这更快:
String[] res = new String[str.length()];
int 0 = 0;
for (char ch: str.toCharArray[]) {
res[i++] = Character.toString(ch);
}
因为toCharArray
必须将字符复制到新数组中。
如果原始字符串包含补充Unicode字符,那么split()
它将不起作用,因为它将这些字符分成代理对。为了正确处理这些特殊字符,可以使用如下代码:
String[] chars = new String[stringToSplit.codePointCount(0, stringToSplit.length())];
for (int i = 0, j = 0; i < stringToSplit.length(); j++) {
int cp = stringToSplit.codePointAt(i);
char c[] = Character.toChars(cp);
chars[j] = new String(c);
i += Character.charCount(cp);
}