no lo hago entender por qué todo los otros están proponiendo expresiones regulares tan complejas o código tan largo. Básicamente, desea obtener dos tipos de cosas de su cadena: secuencias de caracteres que no son espacios o comillas, y secuencias de caracteres que comienzan y terminan con una cita, sin comillas intermedias, para dos tipos de comillas. Se puede sincronizar fácilmente esas cosas con esta expresión regular:
[^\s"']+|"([^"]*)"|'([^']*)'
que añaden los grupos de captura porque no desea que las citas en la lista.
Este código Java construye la lista, agregando el grupo de captura si coincide para excluir las comillas, y agregando la coincidencia total de expresiones regulares si el grupo de captura no coincidió (se hizo coincidir una palabra sin comillas).
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 te importa tener las citas en la lista devuelta, se puede utilizar 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());
}
¿En realidad se utiliza el método de "dividir", o si un bucle con el método de "encontrar" en Matcher ser suficiente ? – erickson
"y ahora tiene dos problemas" – hop