Nie rozumiem, dlaczego wszyscy inni proponują tak złożone wyrażenia regularne lub tak długi kod. Zasadniczo chcesz pobrać dwa rodzaje rzeczy ze swojego ciągu: sekwencje znaków, które nie są spacjami ani cudzysłowami, oraz sekwencje znaków, które zaczynają się i kończą cudzysłowem, bez cudzysłowów pomiędzy, dla dwóch rodzajów cudzysłowów. Możesz łatwo dopasować te rzeczy za pomocą tego wyrażenia regularnego:
[^\s"']+|"([^"]*)"|'([^']*)'
Dodałem grupy przechwytywania, ponieważ nie chcesz cytatów na liście.
Ten kod Java tworzy listę, dodając grupę przechwytywania, jeśli została dopasowana, aby wykluczyć cudzysłowy, i dodając ogólne dopasowanie wyrażenia regularnego, jeśli grupa przechwytywania nie pasuje (dopasowano słowo bez cudzysłowu).
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());
}
}
Jeśli nie masz nic przeciwko umieszczaniu cudzysłowów na zwracanej liście, możesz użyć znacznie prostszego kodu:
List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("[^\\s\"']+|\"[^\"]*\"|'[^']*'");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
matchList.add(regexMatcher.group());
}