No entiendo por qué todos los demás proponen expresiones regulares tan complejas o un código tan largo. Esencialmente, desea tomar dos tipos de cosas de su cadena: secuencias de caracteres que no son espacios ni comillas, y secuencias de caracteres que comienzan y terminan con una cita, sin comillas en medio, para dos tipos de comillas. Puede hacer coincidir fácilmente esas cosas con esta expresión regular:
[^\s"']+|"([^"]*)"|'([^']*)'
Agregué los grupos de captura porque no desea las citas en la lista.
Este código Java crea la lista, agregando el grupo de captura si coincidió para excluir las comillas y agregando la coincidencia general de expresiones regulares si el grupo de captura no coincidió (una palabra sin comillas coincidió).
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());
}
}
Si no le importa tener las comillas en la lista devuelta, puede usar un código mucho más simple:
List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("[^\\s\"']+|\"[^\"]*\"|'[^']*'");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
matchList.add(regexMatcher.group());
}