Ответ 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;
}