Tôi biết, bây giờ tôi có hai vấn đề. Nhưng tôi đang vui vẻ!Phân tích cú pháp đầu vào CSV bằng RegEx trong java
Tôi bắt đầu với this advice không để thử và chia tách, mà thay vào đó để khớp với trường được chấp nhận là gì và mở rộng từ đó sang biểu thức này.
final Pattern pattern = Pattern.compile("\"([^\"]*)\"|(?<=,|^)([^,]*)(?=,|$)");
Biểu thức trông như thế này mà không có sự khó chịu thoát dấu ngoặc kép:
"([^"]*)"|(?<=,|^)([^,]*)(?=,|$)
này đang làm việc tốt cho tôi - hoặc nó phù hợp trên "hai dấu ngoặc kép và bất cứ điều gì là giữa chúng", hoặc "một cái gì đó giữa bắt đầu của dòng hoặc dấu phẩy và cuối dòng hoặc dấu phẩy ". Lặp đi lặp lại qua các trận đấu giúp tôi có được tất cả các lĩnh vực, ngay cả khi chúng trống rỗng. Ví dụ,
the quick, "brown, fox jumps", over, "the",,"lazy dog"
chia ra làm
the quick
"brown, fox jumps"
over
"the"
"lazy dog"
Tuyệt vời! Bây giờ tôi muốn thả các dấu ngoặc kép, vì vậy tôi đã thêm vào các lookahead và lookbehind nhóm không bắt giữ như tôi đã làm cho dấu phẩy.
final Pattern pattern = Pattern.compile("(?<=\")([^\"]*)(?=\")|(?<=,|^)([^,]*)(?=,|$)");
lại biểu thức là:
(?<=")([^"]*)(?=")|(?<=,|^)([^,]*)(?=,|$)
Thay vì kết quả mong muốn
the quick
brown, fox jumps
over
the
lazy dog
bây giờ tôi có được sự cố này:
the quick
"brown
fox jumps"
,over,
"the"
,,
"lazy dog"
tôi thiếu gì?
Tôi cho rằng văn bản của bạn không bao giờ có thể tự chứa dấu ngoặc kép? –
Rất may là không. Tại thời điểm đó tôi sẽ chỉ sử dụng thư viện openCSV. –
thư viện CSV khác cho Java: http://stackoverflow.com/questions/101100/csv-api-for-java – Thilo