Não entendo por que todos os outros estão propondo expressões regulares tão complexas ou códigos tão longos. Essencialmente, você deseja obter dois tipos de coisas de sua string: sequências de caracteres que não são espaços ou aspas e sequências de caracteres que começam e terminam com aspas, sem aspas entre dois tipos de aspas. Você pode combinar facilmente essas coisas com esta expressão regular:
[^\s"']+|"([^"]*)"|'([^']*)'
Eu adicionei os grupos de captura porque você não quer as aspas na lista.
Este código Java constrói a lista, adicionando o grupo de captura se correspondesse para excluir as aspas e adicionando a correspondência de regex geral se o grupo de captura não correspondesse (uma palavra sem aspas foi correspondida).
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());
}
}
Se você não se importa em ter as aspas na lista retornada, pode usar um código muito mais simples:
List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("[^\\s\"']+|\"[^\"]*\"|'[^']*'");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
matchList.add(regexMatcher.group());
}