How to split a string in Java

In Java, we can use String#split() to split a string.


String phone = "012-3456789";

// String#split(string regex) accepts regex as the argument
String[] output = phone.split("-");

String part1 = output[0]; // 012
String part2 = output[1]; // 3456789

Table of contents

1. Split a string (default)

1.1 The below example tries to split a string "012-3456789" by a dash -, into two strings.

StringSplit.java

package com.mkyong.string.split;

public class StringSplit {

    public static void main(String[] args) {

        String phone = "012-3456789";

        String[] output = phone.split("-");

        System.out.println(output.length);  // 2

        String part1 = output[0]; // 012
        String part2 = output[1]; // 3456789

        System.out.println(part1); // 012
        System.out.println(part2); // 3456789

    }

}

Output

Terminal

2
012
3456789

1.2 We can use String#contains to test if the string contains certain characters or delimiters before splitting the string.

StringSplitContains.java

package com.mkyong.string.split;

public class StringSplitContains {

  public static void main(String[] args) {

      String phone = "012-3456789";

      if (phone.contains("-")) {

          String[] output = phone.split("-");
          System.out.println(output[0]);  // 012
          System.out.println(output[1]);  // 3456789

      } else {
          throw new IllegalArgumentException("String " + phone + " does not contain -");
      }

  }

}

Output

Terminal

012
3456789

1.3 For String phone = "0123456789", which doesn’t contain -, it throws IllegalArgumentException.

Terminal

Exception in thread "main" java.lang.IllegalArgumentException: String 0123456789 does not contain -
  at com.mkyong.string.split.StringSplitContains.main(StringSplitContains.java:16)

2. Split a string and retain the delimiter

The String#spring accepts regex as an argument, and we can also use regex lookahead, lookbehind or lookaround to retain the delimiter.

2.1 Below is a positive lookahead example, the delimiter at the right-hand side.


String[] output = phone.split("(?=-)");
System.out.println(output[0]);  // 012
System.out.println(output[1]);  // -3456789

2.2 Below is a positive lookbehind example, the delimiter at the left-hand side.


String[] output2 = phone.split("(?<=-)");
System.out.println(output2[0]);  // 012-
System.out.println(output2[1]);  // 3456789

2.3 A full example.

StringSplitLookAround.java

package com.mkyong.string.split;

public class StringSplitLookAround {

    public static void main(String[] args) {

        String phone = "012-3456789";

        if (phone.contains("-")) {

            // positive lookahead, split char at right-hand side
            String[] output = phone.split("(?=-)");
            System.out.println(output[0]);  // 012
            System.out.println(output[1]);  // -3456789

            // positive lookbehind, split char at left-hand side
            String[] output2 = phone.split("(?<=-)");
            System.out.println(output2[0]);  // 012-
            System.out.println(output2[1]);  // 3456789

        } else {
            throw new IllegalArgumentException("String " + phone + " does not contain -");
        }

    }

}

Output

Terminal

012
-3456789
012-
3456789

3. Split a string and limit the split output

The String#split also supports a second argument, which indicates limit, controls the length of the arrays (output).

3.1 The below example try to split a string and limit the output into three strings; the last string contains the remaining inputs after the last matched delimiter (split character).

StringSplitLimit.java

package com.mkyong.string.split;

public class StringSplitLimit {

    public static void main(String[] args) {

        String phone = "012-345-678-9";
        String[] output = phone.split("-", 3);

        System.out.println(output.length);  // 3

        String part1 = output[0];   // 012
        String part2 = output[1];   // 345
        String part3 = output[2];   // 678-9

        System.out.println(part1);
        System.out.println(part2);
        System.out.println(part3);

    }

}

Output

Terminal

3
012
345
678-9

3.2 The below code snippets try to split a string and limit the output into two strings.


String phone = "012-345-678-9";
String[] output = phone.split("-", 2);

System.out.println(output.length);  // 2

String part1 = output[0];   // 012
String part2 = output[1];   // 345-678-9

4. Split a string by special regex characters

This section talks about escaping the special regex characters as a delimiter.

4.1 Special regex characters

The special regex characters have special meaning as follow:

  1. Period or dot .
  2. Plus sign +
  3. Asterisk or star *
  4. Question mark ?
  5. Caret ^
  6. Dollar sign $
  7. Opening and closing parenthesis ( and )
  8. Opening square bracket [
  9. Opening curly brace {
  10. Pipe symbol |
  11. Backslash \

P.S Both the closing square bracket ] and closing curly brace } is an ordinary character, no need to escape.

4.2 Escaping the special regex characters

If we want to split a string using one of the special regex characters as the delimiter, we must escape it.

For example, if we want to split a string by a vertical bar or pipe symbol | (special regex character), which means or in the regex, we must escape the | symbol using one of the following ways:


  str.split("\\|")              // backslash \ to escape regex special character

  str.split("[|]")              // character class [] to escape regex  special character

  str.split(Pattern.quote("|")) // Pattern#quote() to escape regex special character

4.3 Split a string by a pipe symbol “|”

The below example tries to split a string by a unescape pipe symbol |.

StringSplitSpecial.java

package com.mkyong.string.split;

public class StringSplitSpecial {

  public static void main(String[] args) {

      String csv = "a|b|c|d";
      String[] output = csv.split("|");

      for (String s : output) {
          System.out.println(s);
      }

  }

}

Output

Terminal

a
|
b
|
c
|
d

The below example tries to split a string by an escaped pipe symbol |.

StringSplitSpecialPipe.java

package com.mkyong.string.split;

import java.util.regex.Pattern;

public class StringSplitSpecialPipe {

  public static void main(String[] args) {

      String csv = "a|b|c|d";

      // Three ways to escape regex special character
      // String[] output = csv.split("\\|");
      // String[] output = csv.split("[|]");
      String[] output = csv.split(Pattern.quote("|"));

      for (String s : output) {
          System.out.println(s);
      }

  }

}

4.3 Split a string by a backslash “\”

StringSplitSpecialBackslash.java

package com.mkyong.string.split;

import java.util.regex.Pattern;

public class StringSplitSpecialBackslash {

    public static void main(String[] args) {

        String dir = "C:\\Users\\mkyong\\projects\\mkyong-tutorials";

        // Three ways to escape regex special character
        // String[] output = dir.split("\\\\");
        // String[] output = dir.split("[\\\\]");
        String[] output = dir.split(Pattern.quote("\\"));

        for (String s : output) {
            System.out.println(s);
        }

    }

}

Output

Terminal

C:
Users
mkyong
projects
mkyong-tutorials

4.4 Split a string by a period or dot “.”

StringSplitSpecialPeriod.java

package com.mkyong.string.split;

import java.util.regex.Pattern;

public class StringSplitSpecialPeriod {

  public static void main(String[] args) {

      String dir = "a.b.c.d.e";

      // Three ways to escape regex special character
      // String[] output = dir.split("\\.");
      // String[] output = dir.split("[.]");
      String[] output = dir.split(Pattern.quote("."));

      for (String s : output) {
          System.out.println(s);
      }

  }

}

Output

Terminal

a
b
c
d
e

5. Split a string by multiple delimiters

If we want to split a string by multiple delimiters, just put all the delimiters into brackets [ ].

StringSplitMultiDelimiters.java

package com.mkyong.string.split;

public class StringSplitMultiDelimiters {

  public static void main(String[] args) {

      String dir = "apple|9|1.88;2.78|0#10";
      String[] output = dir.split("[|;#]");

      System.out.println(output.length);  // 6

      for (String s : output) {
          System.out.println(s);
      }

      /*
      System.out.println(output[0]);      // apple
      System.out.println(output[1]);      // 9
      System.out.println(output[2]);      // 1.88
      System.out.println(output[3]);      // 2.78
      System.out.println(output[4]);      // 0
      System.out.println(output[5]);      // 10
      */

  }

}

Output

Terminal

6
apple
9
1.88
2.78
0
10

6. Split a string and Java 8 splitAsStream

6.1 For Java 8 stream, we can use Pattern#splitAsStream to split a string and return a stream.

StringSplitJava8.java

package com.mkyong.string.split;

import java.util.List;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

public class StringSplitJava8 {

    public static void main(String[] args) {

        String phone = "012-3456789";

        // Normal String#split
        // String[] output = phone.split("-");

        // Java 8 splitAsStream
        List<String> output = Pattern.compile("-")
                .splitAsStream(phone)
                .collect(Collectors.toList());

        System.out.println(output);
    }

}

Output

Terminal

[012, 3456789]

6.2 We also can use Arrays.stream to convert a split array into a stream.

SplitString5b.java

package com.mkyong.string.split;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StringSplitJava8 {

    public static void main(String[] args) {

        String phone = "012-3456789";

        List<String> output = Arrays.stream(phone.split("-"))
                .collect(Collectors.toList());

        System.out.println(output);


    }

}

Output

Terminal

[012, 3456789]

7. Split a string by a space or multiple spaces

We can use \\s+ (which means one or more whitespace characters in regex) to split a string by spaces.

StringSplitSpaces.java

package com.mkyong.string.split;

public class StringSplitSpaces {

    public static void main(String[] args) {

        String str = "1 2   3 4  5";
        String[] output = str.split("\\s+");

        for (String s : output) {
            System.out.println(s);
        }

    }

}

Output

Terminal

1
2
3
4
5

8. Split a string by new lines

The different operating system has a different new line format:

  • Unix, Linux or Mac \r
  • Windows \r\n

The example uses the regex pattern \\r?\\n to split a string by new lines and return a stream; later, we trim and filter the empty lines.

StringSplitNewLines.java

package com.mkyong.string.split;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StringSplitNewLines {

    public static void main(String[] args) {

        StringBuilder sb = new StringBuilder();
        sb.append("aaa \n");
        sb.append("bbb   \r\n");
        sb.append("ccc\n");
        sb.append("\n");
        sb.append("ddd\r\n");
        sb.append("\r\n");
        sb.append("eee\n");

        String text = sb.toString();
        System.out.println("---Original---");
        System.out.println(text);

        System.out.println("---Split---");

        // split by new line, trim and filter empty line
        List<String> lines = Arrays.stream(text.split("\\r?\\n"))
                .map(x -> x.trim())
                .filter(x -> x.length() > 0)
                .collect(Collectors.toList());

        for (String line : lines) {
            System.out.println(line);
        }

    }

}

Output

Terminal

---Original---
aaa
bbb   
ccc

ddd

eee

---Split---
aaa
bbb
ccc
ddd
eee

9. Split a string by StringTokenizer (legacy)

Java developers used the StringTokenizer class to split a string.

P.S The String#split() is available since JDK 1.4.

Note
This StringTokenizer is a legacy class, retained for compatibility reasons; the use is discouraged! Please upgrade the code to String#split().

StringSplitStringTokenizer.java

package com.mkyong.string.split;

import java.util.StringTokenizer;

public class StringSplitStringTokenizer {

    public static void main(String[] args) {

        String test = "abc.def.123";
        // the delimiter is a string, not regex, no need to escape the dot
        StringTokenizer token = new StringTokenizer(test, ".");

        while (token.hasMoreTokens()) {
            System.out.println(token.nextToken());
        }

    }

}

Output

Terminal

abc
def
123

10. Download Source Code

$ git clone https://github.com/mkyong/core-java

$ cd java-string

$ cd com/mkyong/string/split

11. References

About Author

author image
Founder of Mkyong.com, love Java and open source stuff. Follow him on Twitter. If you like my tutorials, consider make a donation to these charities.

Comments

Subscribe
Notify of
6 Comments
Most Voted
Newest Oldest
Inline Feedbacks
View all comments
faizee
2 years ago

how to split email id by two and how to set name of before @
i mean how to set recipients name of before @

Naga
5 years ago

Excellent explanation …

rkk1980
3 years ago

How to split the below String using Streams

Input : String s = “aaabbaacccd”
Outpu : String[] sarr = [“aaa”, “bb, “aa”, “ccc”, “d”];

Greg Staley
5 years ago

excelent example…worked first time!

Igor
5 years ago

First one gives me ArrayOutOfBounds what shoud i do?