将字符串拆分为字符串数组


Answers:


120
"cat".split("(?!^)")

这将产生

数组[“ c”,“ a”,“ t”]


8
如何以及为什么?这是一个正则表达式,表示任何字符吗?因为在我看来,通过拆分的方式,应该只拆分实际的字符(,?,!,^和)。但是,它按您所说的那样工作。
Ty_

3
这确实是一个正则表达式,称为负前瞻。在此处签出文档:docs.oracle.com/javase/6/docs/api/java/util/regex/…–
Erwin,

4
@ EW-CodeMonkey (?!... )是否定断言的正则表达式语法–它断言其中的内容不匹配。并且^匹配字符串的开头,因此正则表达式在不是字符串开头的每个位置都匹配,并在其中插入一个分割符。此正则表达式也匹配字符串的末尾,因此也将空字符串附加到结果中,除非String.split文档中 “结果数组中不包含跟踪空字符串”。
Boann 2015年

8
在Java 8中,的行为String.split略有变化,因此零宽度匹配产生的前导空字符串也不会包含在结果数组中,因此(?!^)断言位置不是字符串的开头就变得不必要了,从而允许正则表达式执行以下操作:可以简化为"cat".split("")-–但在Java 7及更低版本中,它将在结果数组中产生一个前导空字符串。
Boann 2015年

1
它创建整个字符串的数组。
爱德华

109
"cat".toCharArray()

但是如果你需要琴弦

"cat".split("")

编辑:将返回一个空的第一个值。


12
“ cat” .split(“”)会返回[,c,a,t],不是吗?您的阵列中将有一个额外的角色...

4
“ cat” .split(“”)不能像Matt所预期的那样工作,您将获得一个额外的空String => [,c,a,t]。

5
如果您使用的是Java 8,此答案现在可以正常工作。请参阅stackoverflow.com/a/22718904/1587046
Alexis C.

4
这是jdk8中的一个可怕变化,因为我依赖split(“”)并做了变通办法,导致了这个愚蠢的空第一个索引。现在,升级到java8后,它可以像我几年前期望的那样工作。不幸的是,现在我的解决方法破坏了我的代码... ggrrrr。
Marc

@Marc您可能.toCharArray()仍然应该使用;它避免使用正则表达式并返回char原始数组,因此它更快,更轻便。需要一个1个字符的字符串数组很奇怪。
Boann 2015年

41
String str = "cat";
char[] cArray = str.toCharArray();

3
细说,最初的问题要求一个String数组,而不是Char数组。但是,从这里获取String数组很容易。
dsolimano 2011年

是的,我已经知道如何获取字符数组。如果没有其他方法,我可以遍历char数组并为每个数组创建一个字符串。
马特

您将如何转换cArrayString
位图

正确的语法为:char [] cArray = str.ToCharArray();
dbz

6

如果输入的字符超出了基本多语言平面(某些CJK字符,新的表情符号...),"a💫b".split("(?!^)")则无法使用诸如之类的方法,因为它们会破坏此类字符(导致array ["a", "?", "?", "b"]),因此必须使用更安全的方法:

"a💫b".codePoints()
    .mapToObj(cp -> new String(Character.toChars(cp)))
    .toArray(size -> new String[size]);

2

将字符串转换为一个单字符字符串数组的有效方法是:

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必须字符复制到新数组中。


2

总结其他答案...

这适用于所有Java版本:

"cat".split("(?!^)")

这仅适用于Java 8及更高版本:

"cat".split("")

0

也许您可以使用遍历String内容的for循环,并使用charAt方法按字符提取字符。

结合使用ArrayList<String>例如,您可以获得单个字符的数组。


也许您可以单腿站起来唱“上帝保佑女王”。抱歉,但这还差得远。
斯蒂芬·C

0
for(int i=0;i<str.length();i++)
{
System.out.println(str.charAt(i));
}

1
您确定这会将字符串拆分为数组吗?您只是将字符串打印到屏幕上。
TDG

0

如果原始字符串包含补充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);
}

0

split("(?!^)")如果字符串包含代理对,则无法正常工作。您应该使用split("(?<=.)")

String[] splitted = "花ab🌹🌺🌷".split("(?<=.)");
System.out.println(Arrays.toString(splitted));

输出:

[花, a, b, 🌹, 🌺, 🌷]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.