String.split () * не * в регулярном выражении? - PullRequest
43 голосов
/ 16 июня 2011

Поскольку String.split() работает с регулярными выражениями, этот фрагмент:

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

... выход: [, s, t, , ?, s, t, , ?, a, , g, h]

Какой самый элегантный способ разбить эту строку на последовательность r? так, чтобы она выдала [st, st, argh]?

РЕДАКТИРОВАТЬ : Я знаю, что могу избежать проблемных ?. Проблема в том, что я не знаю разделитель, и мне не хочется обойти это, написав escapeGenericRegex() функцию.

Ответы [ 8 ]

71 голосов
/ 16 июня 2011

Общее решение с использованием API Java SE:

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

Метод quote возвращает регулярное выражение, которое будет соответствовать строке аргумента в виде литерала.

9 голосов
/ 16 июня 2011

Вы можете использовать

StringUtils.split("?r")

из commons-lang .

5 голосов
/ 16 июня 2011

Побег ?:

s.split("r\\?");
4 голосов
/ 16 июня 2011
String[] strs = str.split(Pattern.quote("r?"));
4 голосов
/ 16 июня 2011

Это также прекрасно работает:

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());
        }
    }
}
2 голосов
/ 16 июня 2011

Использование Разделитель гуавы :

Извлекает неперекрывающиеся подстроки из входной строки, обычно путем распознавания появления последовательности разделителя. Этот разделитель может быть указан как отдельный символ, фиксированная строка, регулярное выражение или экземпляр CharMatcher. Или вместо того, чтобы вообще использовать разделитель, разделитель может извлекать соседние подстроки заданной фиксированной длины.

1 голос
/ 30 июля 2018

Используя непосредственно класс Pattern, можно определить выражение как LITERAL, и в этом случае выражение будет оцениваться как есть (не выражение регулярного выражения).

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

пример:

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

приведет к:

[st, st, argh]
0 голосов
/ 16 июня 2011

1001 * попробовать *

String s = "str?str?argh";
s.split("r\?");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...