miałem dziś podobny problem, a nie wyglądać wszelkich standardowych opcji takich jak StringTokenizer, StrTokenizer, SC dobrze pasowali. Jednak nie jest trudno wdrożyć podstawy.
Ten przykład obsługuje wszystkie przypadki brzegowe, które są obecnie komentowane w innych odpowiedziach. Ostrzegam, nie sprawdziłem jeszcze pełnej zgodności z POSIX. Treść obejmująca testy jednostkowe dostępne on GitHub - wydane w domenie publicznej za pośrednictwem nielicencjonowania.
public List<String> parseArgs(CharSequence argString) {
List<String> tokens = new ArrayList<String>();
boolean escaping = false;
char quoteChar = ' ';
boolean quoting = false;
StringBuilder current = new StringBuilder() ;
for (int i = 0; i<argString.length(); i++) {
char c = argString.charAt(i);
if (escaping) {
current.append(c);
escaping = false;
} else if (c == '\\' && !(quoting && quoteChar == '\'')) {
escaping = true;
} else if (quoting && c == quoteChar) {
quoting = false;
} else if (!quoting && (c == '\'' || c == '"')) {
quoting = true;
quoteChar = c;
} else if (!quoting && Character.isWhitespace(c)) {
if (current.length() > 0) {
tokens.add(current.toString());
current = new StringBuilder();
}
} else {
current.append(c);
}
}
if (current.length() > 0) {
tokens.add(current.toString());
}
return tokens;
}
Znacząco - "jak skorupa ich przetwarza" jest dość trudnym zadaniem; 'shlex' robi to dobrze, ale wiele naiwnych algorytmów tego nie robi. Na przykład w powłoce, "" trzy cztery "i" trzy "" cztery "są dokładnie równoważne, podobnie jak" trzy \ cztery ". –