Saya tidak mengerti mengapa semua yang lain mengusulkan ekspresi reguler yang rumit atau kode yang begitu panjang. Pada dasarnya, Anda ingin mengambil dua jenis hal dari string Anda: urutan karakter yang bukan spasi atau tanda kutip, dan urutan karakter yang dimulai dan diakhiri dengan kutipan, tanpa tanda kutip di antaranya, untuk dua jenis tanda kutip. Anda dapat dengan mudah mencocokkan hal-hal tersebut dengan ekspresi reguler ini:
[^\s"']+|"([^"]*)"|'([^']*)'
Saya menambahkan grup penangkap karena Anda tidak ingin tanda kutip dalam daftar.
Kode Java ini membangun daftar, menambahkan grup penangkap jika cocok untuk mengecualikan tanda kutip, dan menambahkan pencocokan ekspresi reguler jika grup penangkap tidak cocok (kata yang tidak dikutip cocok).
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());
}
}
Jika Anda tidak keberatan memiliki tanda kutip dalam daftar yang dikembalikan, Anda dapat menggunakan kode yang lebih sederhana:
List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("[^\\s\"']+|\"[^\"]*\"|'[^']*'");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
matchList.add(regexMatcher.group());
}