Подтвердить что ты не робот

Альтернатива shlex для Java

Существует ли альтернатива Java shlex для Java? Я хотел бы иметь возможность разделить строки с разделителями строк, как оболочка будет обрабатывать их. Например, если бы я отправил:

one two "three four"
и выполнил разделение, я бы хотел получить токены
one
two
three four
4b9b3361

Ответ 1

У меня была похожая проблема сегодня, и она не выглядела так, как будто бы не подходили стандартные опции, такие как StringTokenizer, StrTokenizer, Scanner. Тем не менее, это не сложно реализовать основы.

Этот пример обрабатывает все крайние случаи, которые в настоящее время комментируются другими ответами. Имейте в виду, я еще не проверил его на полное соответствие POSIX. Gist, включая юнит-тесты, доступные на GitHub - выпущены в открытом доступе через нелицензионное соглашение.

public List<String> shellSplit(CharSequence string) {
    List<String> tokens = new ArrayList<String>();
    boolean escaping = false;
    char quoteChar = ' ';
    boolean quoting = false;
    int lastCloseQuoteIndex = Integer.MIN_VALUE;
    StringBuilder current = new StringBuilder();
    for (int i = 0; i<string.length(); i++) {
        char c = string.charAt(i);
        if (escaping) {
            current.append(c);
            escaping = false;
        } else if (c == '\\' && !(quoting && quoteChar == '\'')) {
            escaping = true;
        } else if (quoting && c == quoteChar) {
            quoting = false;
            lastCloseQuoteIndex = i;
        } else if (!quoting && (c == '\'' || c == '"')) {
            quoting = true;
            quoteChar = c;
        } else if (!quoting && Character.isWhitespace(c)) {
            if (current.length() > 0 || lastCloseQuoteIndex == (i - 1)) {
                tokens.add(current.toString());
                current = new StringBuilder();
            }
        } else {
            current.append(c);
        }
    }
    if (current.length() > 0 || lastCloseQuoteIndex == (string.length() - 1)) {
        tokens.add(current.toString());
    }

    return tokens;
}

Ответ 2

Посмотрите Apache Commons Lang:

org.apache.commons.lang.text.StrTokenizer должен делать то, что вы хотите:

new StringTokenizer("one two \"three four\"", ' ', '"').getTokenArray();