2013-09-07 30 views
14

Tôi đã tìm kiếm trên web cho truy vấn của mình, nhưng không nhận được câu trả lời phù hợp với yêu cầu của tôi một cách chính xác. Tôi có chuỗi của tôi như dưới đây:Xử lý dấu tách với ký tự thoát trong Java String.split() phương pháp

A|B|C|The Steading\|Keir Allan\|Braco|E 

Output của tôi sẽ giống như dưới đây:

A 
B 
C 
The Steading|Keir Allan|Braco 
E 

Yêu cầu của tôi là để bỏ qua các dấu phân cách nếu nó được đi trước bởi các dãy thoát. Tôi đã thử bằng cách sử dụng sau đây lookbehinds tiêu cực trong String.split():

(?<!\\)\| 

Nhưng, vấn đề của tôi là delimiter sẽ được xác định bởi người dùng cuối tự động và nó không cần phải luôn luôn |. Nó có thể là bất kỳ ký tự nào trên bàn phím (không có giới hạn). Do đó, nghi ngờ của tôi là regex ở trên có thể thất bại đối với một số ký tự đặc biệt không được phép trong regex.

Tôi chỉ muốn biết đây có phải là cách hoàn hảo để làm điều đó không.

Trả lời

24

Bạn có thể sử dụng Pattern.quote():

String regex = "(?<!\\\\)" + Pattern.quote(delim); 

Sử dụng ví dụ của bạn:

String delim = "|"; 
String regex = "(?<!\\\\)" + Pattern.quote(delim); 

for (String s : "A|B|C|The Steading\\|Keir Allan\\|Braco|E".split(regex)) 
    System.out.println(s); 
 
A 
B 
C 
The Steading\|Keir Allan\|Braco 
E 

Bạn có thể mở rộng này để sử dụng một dãy thoát tùy chỉnh cũng như:

String delim = "|"; 
String esc = "+"; 
String regex = "(?<!" + Pattern.quote(esc) + ")" + Pattern.quote(delim); 

for (String s : "A|B|C|The Steading+|Keir Allan+|Braco|E".split(regex)) 
    System.out.println(s); 
 
A 
B 
C 
The Steading+|Keir Allan+|Braco 
E 
+0

Cảm ơn phản hồi nhanh chóng. Nhưng, tôi muốn biết nếu tất cả các ký tự đặc biệt được phép trong regex. Có ngoại lệ nào không? – user2757740

+0

@ user2757740 Đọc tài liệu được liên kết của 'Pattern.quote()'; nó lấy một chuỗi và thoát tất cả các ký tự đặc biệt. Không có bất kỳ ngoại lệ nào. – arshajii

+0

Điều đó giải quyết hầu hết câu hỏi của tôi. Cảm ơn rất nhiều .. Nhưng, tôi muốn thực hiện cùng một pattern.quote() cho chuỗi thoát của tôi là tốt. Nhưng, tôi e rằng nó không hoạt động: ((? user2757740

Các vấn đề liên quan