Je ne comprends pas pourquoi tous les autres sont de proposer un tel complexe d'expressions régulières ou longues code. Essentiellement, vous voulez prendre deux sortes de choses à partir de votre chaîne: les séquences de caractères qui ne sont pas des espaces ou des citations, et des séquences de caractères qui commence et se termine avec une citation sans guillemets entre les deux, pour les deux types de guillemets. Vous pouvez facilement faire correspondre ces choses avec cette expression régulière:
[^\s"']+|"([^"]*)"|'([^']*)'
J'ai ajouté les captures de groupes parce que vous ne voulez pas les guillemets dans la liste.
Ce code Java génère la liste, l'ajout de la capture d'un groupe si elle correspond à exclure les citations, et l'ajout de l'ensemble de la correspondance de la regex si la capture d'un groupe n'a pas de match (non coté mot a été apparié).
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 vous ne me dérange pas d'avoir les guillemets dans la liste retournée, vous pouvez utiliser un code bien plus simple:
List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("[^\\s\"']+|\"[^\"]*\"|'[^']*'");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
matchList.add(regexMatcher.group());
}