String.split() *not* on regular expression?

JavaRegex

Java Problem Overview


Since String.split() works with regular expressions, this snippet:

String s = "str?str?argh";
s.split("r?");

... yields: [, s, t, , ?, s, t, , ?, a, , g, h]

What's the most elegant way to split this String on the r? sequence so that it produces [st, st, argh]?

EDIT: I know that I can escape the problematic ?. The trouble is I don't know the delimiter offhand and I don't feel like working this around by writing an escapeGenericRegex() function.

Java Solutions


Solution 1 - Java

A general solution using just Java SE APIs is:

String separator = ...
s.split(Pattern.quote(separator));

The quote method returns a regex that will match the argument string as a literal.

Solution 2 - Java

You can use

StringUtils.split("?r")

from commons-lang.

Solution 3 - Java

This works perfect as well:

public static List<String> splitNonRegex(String input, String delim)
{
    List<String> l = new ArrayList<String>();
    int offset = 0;

    while (true)
    {
        int index = input.indexOf(delim, offset);
        if (index == -1)
        {
            l.add(input.substring(offset));
            return l;
        } else
        {
            l.add(input.substring(offset, index));
            offset = (index + delim.length());
        }
    }
}

Solution 4 - Java

Escape the ?:

s.split("r\\?");

Solution 5 - Java

Use Guava Splitter:

>Extracts non-overlapping substrings from an input string, typically by recognizing appearances of a separator sequence. This separator can be specified as a single character, fixed string, regular expression or CharMatcher instance. Or, instead of using a separator at all, a splitter can extract adjacent substrings of a given fixed length.

Solution 6 - Java

String[] strs = str.split(Pattern.quote("r?"));

Solution 7 - Java

Using directly the Pattern class, is possible to define the expression as LITERAL, and in that case, the expression will be evaluated as is (not regex expression).

Pattern.compile(<literalExpression>, Pattern.LITERAL).split(<stringToBeSplitted>);

example:

String[] result = Pattern.compile("r?", Pattern.LITERAL).split("str?str?argh");

will result:

[st, st, argh]

Solution 8 - Java

org.apache.commons.lang.StringUtils has methods for splitting Strings without expensive regular expressions.

Be sure to read the javadocs closely as the behavior can be subtle. StringUtils.split (as in another answer) does not meet the stated requirements. Use StringUtils.splitByWholeSeparator instead:

String s = "str?str?argh";

StringUtils.split(s, "r?");                   //[st, st, a, gh]
StringUtils.splitByWholeSeparator(s, "r?");   //[st, st, argh]

Solution 9 - Java

try

String s = "str?str?argh";
s.split("r\?");

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionKonrad GarusView Question on Stackoverflow
Solution 1 - JavaStephen CView Answer on Stackoverflow
Solution 2 - JavaBastiSView Answer on Stackoverflow
Solution 3 - JavaMartijn CourteauxView Answer on Stackoverflow
Solution 4 - JavaEtienne de MartelView Answer on Stackoverflow
Solution 5 - JavamindasView Answer on Stackoverflow
Solution 6 - Java贼小气View Answer on Stackoverflow
Solution 7 - JavaManuel RomeiroView Answer on Stackoverflow
Solution 8 - JavaAlex WittigView Answer on Stackoverflow
Solution 9 - JavaAkash AgrawalView Answer on Stackoverflow