Ich verstehe nicht, warum alle anderen so komplexe reguläre Ausdrücke oder so langen Code vorschlagen. Im Wesentlichen möchten Sie zwei Arten von Dingen aus Ihrer Zeichenfolge herausholen: Zeichenfolgen, die keine Leerzeichen oder Anführungszeichen sind, und Zeichenfolgen, die mit einem Anführungszeichen ohne dazwischen liegende Anführungszeichen beginnen und enden, für zwei Arten von Anführungszeichen. Sie können diese Dinge leicht mit diesem regulären Ausdruck abgleichen:
[^\s"']+|"([^"]*)"|'([^']*)'
Ich habe die Erfassungsgruppen hinzugefügt, weil Sie die Anführungszeichen nicht in der Liste haben möchten.
Dieser Java-Code erstellt die Liste, fügt die Erfassungsgruppe hinzu, wenn sie übereinstimmt, um die Anführungszeichen auszuschließen, und fügt die allgemeine Regex-Übereinstimmung hinzu, wenn die Erfassungsgruppe nicht übereinstimmt (ein nicht zitiertes Wort wurde abgeglichen).
List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("[^\\s\"']+|\"([^\"]*)\"|'([^']*)'");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
if (regexMatcher.group(1) != null) {
// Add double-quoted string without the quotes
matchList.add(regexMatcher.group(1));
} else if (regexMatcher.group(2) != null) {
// Add single-quoted string without the quotes
matchList.add(regexMatcher.group(2));
} else {
// Add unquoted word
matchList.add(regexMatcher.group());
}
}
Wenn es Ihnen nichts ausmacht, die Anführungszeichen in der zurückgegebenen Liste zu haben, können Sie viel einfacheren Code verwenden:
List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("[^\\s\"']+|\"[^\"]*\"|'[^']*'");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
matchList.add(regexMatcher.group());
}