Tôi không hiểu tại sao tất cả những người khác lại đề xuất các biểu thức chính quy phức tạp hoặc mã dài như vậy. Về cơ bản, bạn muốn lấy hai loại thứ từ chuỗi của mình: chuỗi ký tự không phải là dấu cách hoặc dấu ngoặc kép và chuỗi ký tự bắt đầu và kết thúc bằng dấu ngoặc kép, không có dấu ngoặc kép ở giữa, đối với hai loại dấu ngoặc kép. Bạn có thể dễ dàng đối sánh những thứ đó với biểu thức chính quy này:
[^\s"']+|"([^"]*)"|'([^']*)'
Tôi đã thêm các nhóm chụp vì bạn không muốn các trích dẫn trong danh sách.
Mã Java này xây dựng danh sách, thêm nhóm thu thập nếu nó phù hợp để loại trừ các dấu ngoặc kép và thêm đối sánh regex tổng thể nếu nhóm thu thập không khớp (một từ chưa được trích dẫn đã khớp).
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());
}
}
Nếu bạn không phiền khi có các dấu ngoặc kép trong danh sách trả về, bạn có thể sử dụng mã đơn giản hơn nhiều:
List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("[^\\s\"']+|\"[^\"]*\"|'[^']*'");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
matchList.add(regexMatcher.group());
}