如何分割一个字符串的空间

我需要用空格分割我的字符串。 为此,我尝试:

str = "Hello I'm your String";
String[] splited = str.split(" ");

但这似乎并不奏效。

1075550 次浏览

你所拥有的应该有用。但是,如果所提供的空格默认为…别的吗?你可以使用空白正则表达式:

str = "Hello I'm your String";
String[] splited = str.split("\\s+");

这将导致任意数量的连续空格将字符串分割为令牌。

我相信在str.split括号中放入正则表达式应该可以解决这个问题。Java String.split()方法是基于正则表达式的,所以你需要:

str = "Hello I'm your String";
String[] splitStr = str.split("\\s+");

使用Stringutils.split()按白色间距分割字符串。例如StringUtils.split("Hello World")返回"Hello"和"World";

为了解决上述情况,我们采用了这样的分割方法

String split[]= StringUtils.split("Hello I'm your String");

当我们打印拆分数组时,输出将是:

你好

你的

字符串

完整的演示示例请看这里

另一种方法是:

import java.util.regex.Pattern;


...


private static final Pattern SPACE = Pattern.compile(" ");
String[] arr = SPACE.split(str); // str is the string to be split

在这里

如果你不想使用String split方法,那么你可以使用Java中的StringTokenizer类作为..

    StringTokenizer tokens = new StringTokenizer("Hello I'm your String", " ");
String[] splited = new String[tokens.countTokens()];
int index = 0;
while(tokens.hasMoreTokens()){
splited[index] = tokens.nextToken();
++index;
}

虽然接受的答案很好,但请注意,如果您的输入字符串以空白开始,那么您将以一个前导空字符串结束。例如,使用:

String str = " Hello I'm your String";
String[] splitStr = str.split("\\s+");

结果将是:

splitStr[0] == "";
splitStr[1] == "Hello";
splitStr[2] == "I'm";
splitStr[3] == "Your";
splitStr[4] == "String";

所以你可能想要在分割字符串之前修剪它:

String str = " Hello I'm your String";
String[] splitStr = str.trim().split("\\s+");

(编辑)

除了trim警告之外,你可能还想考虑unicode不间断空格字符(U+00A0)。这个字符打印出来就像字符串中的常规空格一样,通常隐藏在富文本编辑器或web页面复制粘贴的文本中。它们不会被.trim()处理,它会测试使用c <= ' '删除的字符;\s也不会捕获它们。

相反,你可以使用\p{Blank},但你需要启用unicode字符支持,而常规的split不会这样做。例如,这将工作:Pattern.compile("\\p{Blank}", UNICODE_CHARACTER_CLASS).split(words),但它不会做trim部分。

下面演示了该问题并提供了解决方案。它是从最优依赖于regex,但现在Java有8位/ 16位字节表示,一个有效的解决方案变得相当长。

public class SplitStringTest
{
static final Pattern TRIM_UNICODE_PATTERN = Pattern.compile("^\\p{Blank}*(.*)\\p{Blank}$", UNICODE_CHARACTER_CLASS);
static final Pattern SPLIT_SPACE_UNICODE_PATTERN = Pattern.compile("\\p{Blank}", UNICODE_CHARACTER_CLASS);


public static String[] trimSplitUnicodeBySpace(String str)
{
Matcher trimMatcher = TRIM_UNICODE_PATTERN.matcher(str);
boolean ignore = trimMatcher.matches(); // always true but must be called since it does the actual matching/grouping
return SPLIT_SPACE_UNICODE_PATTERN.split(trimMatcher.group(1));
}


@Test
void test()
{
String words = " Hello I'm\u00A0your String\u00A0";
// non-breaking space here --^ and there -----^


String[] split = words.split(" ");
String[] trimAndSplit = words.trim().split(" ");
String[] splitUnicode = SPLIT_SPACE_UNICODE_PATTERN.split(words);
String[] trimAndSplitUnicode = trimSplitUnicodeBySpace(words);


System.out.println("words: [" + words + "]");
System.out.println("split: [" + Arrays.stream(split).collect(Collectors.joining("][")) + "]");
System.out.println("trimAndSplit: [" + Arrays.stream(trimAndSplit).collect(Collectors.joining("][")) + "]");
System.out.println("splitUnicode: [" + Arrays.stream(splitUnicode).collect(Collectors.joining("][")) + "]");
System.out.println("trimAndSplitUnicode: [" + Arrays.stream(trimAndSplitUnicode).collect(Collectors.joining("][")) + "]");
}
}

结果:

words: [ Hello I'm your String ]
split: [][Hello][I'm your][String ]
trimAndSplit: [Hello][I'm your][String ]
splitUnicode: [][Hello][I'm][your][String]
trimAndSplitUnicode: [Hello][I'm][your][String]

试试这个

    String str = "This is String";
String[] splited = str.split("\\s+");


String split_one=splited[0];
String split_second=splited[1];
String split_three=splited[2];


Log.d("Splited String ", "Splited String" + split_one+split_second+split_three);

简单的吐串由空间

    String CurrentString = "First Second Last";
String[] separated = CurrentString.split(" ");


for (int i = 0; i < separated.length; i++) {


if (i == 0) {
Log.d("FName ** ", "" + separated[0].trim() + "\n ");
} else if (i == 1) {
Log.d("MName ** ", "" + separated[1].trim() + "\n ");
} else if (i == 2) {
Log.d("LName ** ", "" + separated[2].trim());
}
}

好的,我们要做拆分因为你已经得到答案了,我要推广一下。

如果要用空格分隔任何字符串,请使用分隔符(特殊字符)。

首先,删除前导空格,因为它们造成了大多数问题。

str1 = "    Hello I'm your       String    ";
str2 = "    Are you serious about this question_  boy, aren't you?   ";

首先去掉前导空格,可以是空格、制表符等。

String s = str1.replaceAll("^\\s+","");//starting with whitespace one or more

如果你想按空格或任何特殊字符分割。

String[] sa = s.split("[^\\w]+");//split by any non word char

但是由于w包含[a-zA-Z_0-9],所以如果你想用下划线(_)分割也可以使用

 String[] sa = s.split("[!,? ._'@]+");//for str2 after removing leading space

这里有一个方法来修剪有“,”或空白的字符串

private String shorterName(String s){
String[] sArr = s.split("\\,|\\s+");
String output = sArr[0];


return output;
}

你可以使用下面的代码分离字符串:

   String theString="Hello world";


String[] parts = theString.split(" ");


String first = parts[0];//"hello"


String second = parts[1];//"World"

因为这些答案已经发布了一段时间了,下面是另一种更流行的回答方法:

List<String> output = new ArrayList<>();
try (Scanner sc = new Scanner(inputString)) {
while (sc.hasNext()) output.add(sc.next());
}

现在你有了一个字符串列表(可以说比数组更好);如果你确实需要一个数组,你可以使用output.toArray(new String[0]);

下面是一个非常简单的例子:

希望能有所帮助。

String str = "Hello I'm your String";
String[] splited = str.split(" ");
var splited = str.split(" ");
var splited1=splited[0]; //Hello
var splited2=splited[1]; //I'm
var splited3=splited[2]; //your
var splited4=splited[3]; //String

不仅是空白,我的解决方案也解决了看不见的字符。

str = "Hello I'm your String";
String[] splited = str.split("\p{Z}");

将解决方案整合在一起!

public String getFirstNameFromFullName(String fullName){
int indexString = fullName.trim().lastIndexOf(' ');
return (indexString != -1)  ? fullName.trim().split("\\s+")[0].toUpperCase() : fullName.toUpperCase();
}

char用单引号代替双引号

String[] split = str.split(' ');