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
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.favtuts.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
}
}
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.favtuts.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
012
3456789
1.3 For String phone = "0123456789", which doesn’t contain -, it throws IllegalArgumentException.
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.favtuts.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
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.favtuts.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
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:
- Period or dot
. - Plus sign
+ - Asterisk or star
* - Question mark
? - Caret
^ - Dollar sign
$ - Opening and closing parenthesis
(and) - Opening square bracket
[ - Opening curly brace
{ - Pipe symbol
| - 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.favtuts.string.split;
public class StringSplitSpecial {
public static void main(String[] args) {
String csv = "a|b|c|d";
String[] output = csv.split("|");
System.out.println(output.length);
for (String s : output) {
System.out.println(s);
}
}
}
Output
7
a
|
b
|
c
|
d
The below example tries to split a string by an escaped pipe symbol |.
StringSplitSpecialPipe.java
package com.favtuts.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("|"));
System.out.println(output.length);
for (String s : output) {
System.out.println(s);
}
}
}
4.4 Split a string by a backslash “\”
StringSplitSpecialBackslash.java
package com.favtuts.string.split;
import java.util.regex.Pattern;
public class StringSplitSpecialBackslash {
public static void main(String[] args) {
String dir = "C:\\Users\\favtuts\\projects\\favtuts-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
C:
Users
favtuts
projects
favtuts-tutorials
4.4 Split a string by a period or dot “.”
StringSplitSpecialPeriod.java
package com.favtuts.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
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.favtuts.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
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.favtuts.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
[012, 3456789]
6.2 We also can use Arrays.stream to convert a split array into a stream.
SplitString5b.java
package com.favtuts.string.split;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class SplitString5b {
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
[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.favtuts.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
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.favtuts.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
---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
StringTokenizeris a legacy class, retained for compatibility reasons; the use is discouraged! Please upgrade the code toString#split().
StringSplitStringTokenizer.java
package com.favtuts.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
abc
def
123
Download Source Code
$ git clone https://github.com/favtuts/java-core-tutorials-examples
$ cd java-string