मुझे समझ में नहीं आता कि अन्य सभी ऐसे जटिल नियमित अभिव्यक्ति या इतने लंबे कोड का प्रस्ताव क्यों दे रहे हैं। अनिवार्य रूप से, आप दो प्रकार की चीजों को अपने स्ट्रिंग से हथियाना चाहते हैं: पात्रों के अनुक्रम जो रिक्त स्थान या उद्धरण नहीं हैं, और उन पात्रों के अनुक्रम जो एक उद्धरण के साथ शुरू और अंत होते हैं, बीच में कोई उद्धरण नहीं, दो प्रकार के उद्धरणों के लिए। आप इस नियमित अभिव्यक्ति के साथ उन चीजों को आसानी से मिला सकते हैं:
[^\s"']+|"([^"]*)"|'([^']*)'
मैंने कैप्चरिंग समूहों को जोड़ा क्योंकि आप सूची में उद्धरण नहीं चाहते हैं।
यह जावा कोड सूची बनाता है, यदि कैप्चरिंग ग्रुप को जोड़ते हुए अगर यह उद्धरणों को बाहर करने के लिए मेल खाता है, और समग्र रेगेक्स मैच को जोड़ रहा है यदि कैप्चरिंग ग्रुप मैच नहीं करता है (एक अछूता शब्द मिलान नहीं हुआ था)।
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());
}