Gumbo đã sang phải bằng một look-behind assertion, nhưng trong trường hợp của bạn có chứa chuỗi ký tự thoát thoát (ví dụ \\
) ngay trước mặt một dấu phẩy, sự chia rẽ có thể phá vỡ. Xem ví dụ sau:
test1\,test1,test2\\,test3\\\,test3\\\\,test4
Nếu bạn làm một đơn giản nhìn đằng sau chia cho (?<!\\),
như Gumbo đề nghị, chuỗi được chia thành hai phần chỉ test1\,test1
và test2\\,test3\\\,test3\\\\,test4
. Điều này là do cái nhìn phía sau chỉ kiểm tra một nhân vật trở lại cho nhân vật thoát. Điều gì thực sự là chính xác, nếu chuỗi được phân tách trên dấu phẩy và dấu phẩy trước một số ký tự thoát.
Để đạt được điều này một chút phức tạp (double) hơn trông-đằng sau biểu hiện là cần thiết:
(?<!(?<![^\\]\\(?:\\{2}){0,10})\\),
Sử dụng biểu thức chính quy phức tạp hơn này trong Java, một lần nữa yêu cầu để thoát khỏi tất cả \
bởi \\
. Vì vậy, đây phải là một câu trả lời phức tạp hơn cho câu hỏi của bạn:
"any comma separated string".split("(?<!(?<![^\\\\]\\\\(?:\\\\{2}){0,10})\\\\),");
Lưu ý: Java không hỗ trợ lặp lại vô hạn bên trong lookbehinds. Do đó, chỉ có tối đa 10 ký tự thoát kép lặp lại được kiểm tra bằng cách sử dụng biểu thức {0,10}
. Nếu cần, bạn có thể tăng giá trị này bằng cách điều chỉnh số sau.
Có thể làm như sau: 'abc:' def: ghi ": jkl'? –