452

I need to split my String by spaces. For this I tried:

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

But it doesn't seem to work.

5
  • 5
    Looks good... what are the values in the 'splited' array?
    – npinti
    Commented Oct 26, 2011 at 6:56
  • 2
    Your code does indeed work as-is. See code run live at IdeOne.com. Commented Oct 12, 2018 at 18:46
  • @BasilBourque - I couldn't find any run button on that link
    – nanosoft
    Commented Jan 9, 2020 at 8:27
  • 2
    @nanosoft The page at IdeOne.com runs automatically upon loading. See output below the code, in stdout section. To alter the code, click the fork link near top left corner. Commented Jan 9, 2020 at 8:48
  • Does this answer your question? How do I split a string with any whitespace chars as delimiters?
    – scai
    Commented Feb 13, 2020 at 15:06

18 Answers 18

827

What you have should work. If, however, the spaces provided are defaulting to... something else? You can use the whitespace regex:

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

This will cause any number of consecutive spaces to split your string into tokens.

11
  • what regular expression to use if we have to split on these space , + - / ;
    – user2603796
    Commented Dec 30, 2015 at 13:48
  • I'm not sure off the top of my head. If it's only space, you can form your own class by bracketing it, so in your case probably (note, this is untested) [ +\\-/;]+ - notice the \` around the -` to escape it. Now, this will probably match This is+a+ - + - + - test into 4 tokens, which may or may not be desired. The real problem is you can't use \\s to match "any whitespace". You might be better off not using split, and just using Matcher m = Pattern.compile("([A-Za-z0-9]+)").matcher(text); while(m.find()) list.add(m.group(1)); to fetch words instead of splitting a big text.
    – corsiKa
    Commented Dec 30, 2015 at 16:27
  • @FarazAhmad Note that those are just off the top of my head, there could be little bugs, so don't copy/paste the code in that comment :)
    – corsiKa
    Commented Dec 30, 2015 at 16:28
  • string.split("\\s+")[0] - gets only the first part
    – Combine
    Commented Nov 24, 2016 at 19:54
  • 1
    I find it useful as my use case was to split the string and remove multiple spaces. One line of code does both for me. Commented Jul 10, 2018 at 9:06
140

While the accepted answer is good, be aware that you will end up with a leading empty string if your input string starts with a white space. For example, with:

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

The result will be:

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

So you might want to trim your string before splitting it:

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

[edit]

In addition to the trim caveat, you might want to consider the unicode non-breaking space character (U+00A0). This character prints just like a regular space in string, and often lurks in copy-pasted text from rich text editors or web pages. They are not handled by .trim() which tests for characters to remove using c <= ' '; \s will not catch them either.

Instead, you can use \p{Blank} but you need to enable unicode character support as well which the regular split won't do. For example, this will work: Pattern.compile("\\p{Blank}", UNICODE_CHARACTER_CLASS).split(words) but it won't do the trim part.

The following demonstrates the problem and provides a solution. It is far from optimal to rely on regex for this, but now that Java has 8bit / 16bit byte representation, an efficient solution for this becomes quite long.

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 ignored = trimMatcher.matches();
        return SPLIT_SPACE_UNICODE_PATTERN.split(trimMatcher.group(1));
    }

    @Test
    public 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: [" + String.join("][", split) + "]");
        System.out.println("trimAndSplit: [" + String.join("][", trimAndSplit) + "]");
        System.out.println("splitUnicode: [" + String.join("][", splitUnicode) + "]");
        System.out.println("trimAndSplitUnicode: [" + String.join("][", trimAndSplitUnicode) + "]");
    }
}

Results in:

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]
3
  • Thanks for this detailed answer. I was running into an exception because of leading and trailing spaces.
    – ninja
    Commented Jul 11, 2020 at 8:56
  • 1
    String str = " Hello <space><space><space>I'm your String";, you will get [Hello][][][I'm your][String ], but we only want [Hello][I'm][your][String]
    – steven
    Commented Jan 31 at 9:16
  • @steven You are absolutely right, thanks for pointing this out! I fixed the proposed solution, the regex was simply missing a +
    – GaspardP
    Commented Feb 1 at 18:24
32

I do believe that putting a regular expression in the str.split parentheses should solve the issue. The Java String.split() method is based upon regular expressions so what you need is:

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

Use Stringutils.split() to split the string by whites paces. For example StringUtils.split("Hello World") returns "Hello" and "World";

In order to solve the mentioned case we use split method like this

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

when we print the split array the output will be :

Hello

I'm

your

String

For complete example demo check here

12

Try

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

http://download.oracle.com/javase/tutorial/essential/regex/pre_char_classes.html

8

if somehow you don't wanna use String split method then you can use StringTokenizer class in Java as..

    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;
    }
2
  • There is a possibility of throwing ArrayIndexOutofBounds Exception.
    – Ajay Takur
    Commented Aug 12, 2014 at 12:54
  • 3
    No, this won't throw "ArrayIndexOutofBounds" because i have declare array size according to number of tokens found in String. this will make sure that arrays size won't be more than received tokens in a string. Commented Aug 13, 2014 at 7:08
7

Try this one

    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);
7

OK, so we have to do splitting as you already got the answer I would generalize it.

If you want to split any string by spaces, delimiter(special chars).

First, remove the leading space as they create most of the issues.

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

First remove the leading space which can be space, tab etc.

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

Now if you want to split by space or any special char.

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

But as w contains [a-zA-Z_0-9] ,so if you want to split by underscore(_) also use

 String[] sa = s.split("[!,? ._'@]+");//for str2 after removing leading space
1
  • 2
    That replaceAll("^\\s+","") saved my day. That worked for my case. Thank you Commented May 21, 2020 at 13:37
5

An alternative way would be:

import java.util.regex.Pattern;

...

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

Saw it here

4

You can separate string using the below code:

   String theString="Hello world";

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

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

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

Very Simple Example below:

Hope it helps.

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
2

Since it's been a while since these answers were posted, here's another more current way to do what's asked:

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

Now you have a list of strings (which is arguably better than an array); if you do need an array, you can do output.toArray(new String[0]);

1
  • How is this at all better than a simple string.split(" ")?
    – csjh
    Commented Nov 28, 2022 at 2:59
2

Not only white space, but my solution also solves the invisible characters as well.

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

Here is a method to trim a String that has a "," or white space

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

        return output;
    }
0

Simple to Spit String by Space

    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());
         }
     }
0

Join solutions in one!

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

Single quotes for char instead of double

String[] splited = str.split(' ');
1
  • Why does single vs double matter? Aren't they the same? Commented Sep 2, 2023 at 7:48
0

All your need is

org.apache.commons.lang3.StringUtils.split(message, " ")

You need not use trim your string or consider enable unicode character support , and you also could ignore multi-spaces in the string.

Not the answer you're looking for? Browse other questions tagged or ask your own question.