ich heute hatte ein ähnliches Problem, und es sah nicht wie alle Standardoptionen wie StringTokenizer, StrTokenizer, Sc Anner passte gut. Es ist jedoch nicht schwer, die Grundlagen zu implementieren.
In diesem Beispiel werden alle Randfälle behandelt, die derzeit zu anderen Antworten kommentiert werden. Seien Sie gewarnt, ich habe es noch nicht auf volle POSIX-Kompatibilität überprüft. Gist einschließlich Komponententests verfügbar on GitHub - veröffentlicht in der Öffentlichkeit über die Unlizenz.
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;
}
Bemerkenswert - "wie die Shell sie verarbeiten würde" ist eine ziemlich schwierige Aufgabe; 'shlex' macht es gut, aber viele naive Algorithmen nicht. Zum Beispiel sind in der Shell "drei vier" und "drei" vier genau gleichwertig wie "drei \ vier". –