Я не розумію, чому всі інші пропонують такі складні регулярні вирази чи такий довгий код. По суті, ви хочете схопити з вашого рядка два види речей: послідовності символів, які не є пробілами чи лапки, і послідовності символів, які починаються і закінчуються цитатою, без цитат між двома цитатами. Ви можете легко зіставити ці речі за допомогою цього регулярного виразу:
[^\s"']+|"([^"]*)"|'([^']*)'
Я додав групи захоплення, тому що ви не хочете, щоб цитати були у списку.
Цей код Java будує список, додаючи групу захоплення, якщо вона збігається з виключенням лапок, і додає загальний збіг регулярних виразів, якщо група захоплення не збігається (слово без котирування збігалося).
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());
}
}
Якщо ви не заперечуєте, щоб лапки були у поверненому списку, ви можете використовувати набагато простіший код:
List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("[^\\s\"']+|\"[^\"]*\"|'[^']*'");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
matchList.add(regexMatcher.group());
}