tôi là loại mắc kẹt cố gắng để đưa ra biểu thức chính quy để phá vỡ chuỗi với các thuộc tính sau:java regex split chuỗi
- Delimited bởi | (Ống) nhân vật
- Nếu một giá trị cá nhân chứa một đường ống, thoát với \ (backslash)
- Nếu một giá trị cá nhân kết thúc với dấu chéo ngược, trốn thoát với dấu chéo ngược
Vì vậy, ví dụ, đây là một số chuỗi tôi muốn chia tay:
One|Two|Three
nên năng suất:["One", "Two", "Three"]
One\|Two\|Three
nên năng suất:["One|Two|Three"]
One\\|Two\|Three
nên năng suất:["One\", "Two|Three"]
Bây giờ làm thế nào tôi có thể chia này lên với một regex duy nhất?
CẬP NHẬT: Như nhiều bạn đã đề xuất, đây không phải là ứng dụng tốt của regex. Ngoài ra, các giải pháp regex là đơn đặt hàng của cường độ chậm hơn so với chỉ lặp qua các ký tự. Tôi đã kết thúc lặp lại các ký tự:
public static List<String> splitValues(String val) {
final List<String> list = new ArrayList<String>();
boolean esc = false;
final StringBuilder sb = new StringBuilder(1024);
final CharacterIterator it = new StringCharacterIterator(val);
for(char c = it.first(); c != CharacterIterator.DONE; c = it.next()) {
if(esc) {
sb.append(c);
esc = false;
} else if(c == '\\') {
esc = true;
} else if(c == '|') {
list.add(sb.toString());
sb.delete(0, sb.length());
} else {
sb.append(c);
}
}
if(sb.length() > 0) {
list.add(sb.toString());
}
return list;
}
Hãy làm cho nó rõ ràng. Những gì bạn muốn là: chia cho | và loại bỏ nó khỏi chuỗi, không chia cho \ | và loại bỏ \ từ chuỗi và cuối cùng chia cho \\ | và xóa \ | từ phần đầu tiên và \ từ phần thứ hai. Làm thế nào để bạn nghĩ rằng điều này có thể được thực hiện với một regexp? Có vẻ như hoàn cảnh khác hoàn toàn đối với tôi ... – user219882
Có thể thay đổi các dấu phân cách của bạn không? – Paul
Tôi nghĩ các bạn đã đúng! Điều này có thể là quá nhiều đối với regex. –