2017-03-04 25 views
6

Tôi có chuỗi java trông như thế này;Java Regex tách chuỗi giữa dấu phân cách và giữ dấu phân tách

(fname:jon)(lname:doe)(guaranteer: Sam (W) Willis)(age:35)(addr:1 Turnpike Plaza)(favcolor:blue) 

Và tôi muốn chia Chuỗi này khỏi dấu phân tách (fname:jon)<here>(lname:doe).

tôi đã cố gắng tách thông qua regex \)\( nhưng nó chỉ phá vỡ mã của tôi

arr = s.split("\\)\\("); 
for (String a: arr) System.out.println(a); 

Output

(fname:jon 
lname:doe 
guaranteer: Sam (W) Willis 
age:35 
addr:1 Turnpike Plaza 
favcolor:blue) 

Tôi cũng nhìn câu hỏi này: How to split a string, but also keep the delimiters?, nhưng nó đã không giúp bởi vì trong trường hợp của tôi , Tôi cũng muốn giữ dấu phân cách )( và phân tách dấu phân cách đồng đều, tức là, dấu ngoặc đầu tiên phải đi đến kết quả đầu tiên và kết quả thứ hai đến thứ hai.

Các regex mà tôi sử dụng là s.split("(?<=\\)\\()") và nó đã cho kết quả:

(fname:jon)(
lname:doe)(
guaranteer: Sam (W) Willis)(
age:35)(
addr:1 Turnpike Plaza)(
favcolor:blue) 

Đây là đầu ra mong muốn của tôi:

(fname:jon) 
(lname:doe) 
(guaranteer: Sam (W) Willis) 
(age:35) 
(addr:1 Turnpike Plaza) 
(favcolor:blue) 
+2

Hãy thử ') ' –

+0

@Wiktor Stribiżew Tôi đã đặc biệt chỉ ra lý do tại sao câu trả lời mà không giúp trong trường hợp của tôi. Bạn có thể cho tôi biết tại sao bản sao này lại không? – Cupid

+0

Câu trả lời tổng quát tất cả các trường hợp đó là http://stackoverflow.com/a/2848147/3832970. Thứ ba từ phía dưới là trường hợp của bạn. –

Trả lời

7

Bạn có thể chia chuỗi bằng cách sử dụng lookahead tích cực và lookbehind tích cực như thế này:

RegEx (?<=\))(?=\()

DEMO

  1. (?<=\)) lookbehind tích cực cho biết khung đóng phải đứng trước vị trí tách.
  2. (?=\() lookahead tích cực cho biết rằng dấu ngoặc mở phải theo vị trí chia tách đó.

Output

(fname:jon) 
(lname:doe) 
(guaranteer: Sam (W) Willis) 
(age:35) 
(addr:1 Turnpike Plaza) 
(favcolor:blue) 

String s = "(fname:jon)(lname:doe)(guaranteer: Sam (W) Willis)(age:35)(addr:1 Turnpike Plaza)(favcolor:blue)"; 
String arr[] = s.split("(?<=\\))(?=\\()"); 
for (String a: arr) System.out.println(a); 
+0

Xóa vô nghĩa '. {0}' - nó không có tác dụng gì cả, Và bạn không chính xác: Không có ký tự "null" được khớp ở đây, ký tự null là ''\ 0''. Trận đấu là * giữa * ký tự dựa trên diện mạo xung quanh, không có gì đặc biệt đặc biệt. – Bohemian

+0

@Bohemian Tôi giữ nguyên '.{0} 'chỉ để chỉ ra rằng * đây là dấu phân tách *. By null Tôi thực sự có nghĩa là * vị trí trống giữa lookahead tích cực và lookbehind tích cực *. Tuy nhiên, cảm ơn vì đã chỉ ra nó, tôi đã cập nhật câu trả lời của mình cho phù hợp. –

+0

Bạn chưa thực sự cập nhật tất cả bài đăng của mình, đặc biệt là câu đầu tiên – Bohemian

7

Bạn có thể sử dụng một lookbehind dươnglookahead tiêu cực để đạt được điều này:

012.
public static void main(String[] args) throws Exception { 
    String s = "(fname:jon)(lname:doe)(guaranteer: Sam (W) Willis)(age:35)" 
      + "(addr:1 Turnpike Plaza)(favcolor:blue)"; 
    String[] arr = s.split("(?<=\\)(?!\\s))"); // positive lookbehind for ")" and negative lookahead for "space" 
    for (String str : arr) { 
     System.out.println(str); 
    } 

} 

O/P: (? <= \\) (? = \\()

(fname:jon) 
(lname:doe) 
(guaranteer: Sam (W) Willis) 
(age:35) 
(addr:1 Turnpike Plaza) 
(favcolor:blue) 
Các vấn đề liên quan