Cách tiếp cận đơn giản nhất là không khớp các dấu phân cách, tức là dấu phẩy, với logic bổ sung phức tạp để khớp với những gì được dự định thực sự (dữ liệu có thể được trích dẫn chuỗi), chỉ để loại trừ các dấu phân cách sai, nhưng phù hợp với dữ liệu dự định ở vị trí đầu tiên.
Mẫu bao gồm hai lựa chọn thay thế, một chuỗi được trích dẫn ( "[^"]*"
hoặc ".*?"
) hoặc mọi thứ cho đến dấu phẩy tiếp theo ( [^,]+
). Để hỗ trợ các ô trống, chúng tôi phải cho phép mục không được trích dẫn để trống và sử dụng dấu phẩy tiếp theo, nếu có và sử dụng \\G
neo:
Pattern p = Pattern.compile("\\G\"(.*?)\",?|([^,]*),?");
Mẫu cũng chứa hai nhóm chụp để lấy một trong hai nội dung của chuỗi được trích dẫn hoặc nội dung đơn giản.
Sau đó, với Java 9, chúng ta có thể nhận được một mảng như
String[] a = p.matcher(input).results()
.map(m -> m.group(m.start(1)<0? 2: 1))
.toArray(String[]::new);
trong khi các phiên bản Java cũ hơn cần một vòng lặp như
for(Matcher m = p.matcher(input); m.find(); ) {
String token = m.group(m.start(1)<0? 2: 1);
System.out.println("found: "+token);
}
Thêm các mục vào một List
hoặc một mảng là một đặc điểm cho người đọc.
Đối với Java 8, bạn có thể sử dụng việc results()
thực hiện câu trả lời này , để thực hiện nó giống như giải pháp Java 9.
Đối với nội dung hỗn hợp với các chuỗi nhúng, như trong câu hỏi, bạn chỉ cần sử dụng
Pattern p = Pattern.compile("\\G((\"(.*?)\"|[^,])*),?");
Nhưng sau đó, các chuỗi được giữ ở dạng trích dẫn của họ.
String line = "equals: =,\"quote: \"\"\",\"comma: ,\""
, tất cả những gì bạn cần làm là loại bỏ trích dẫn kép không liên quan nhân vật.