2017-03-04 128 views
6

我有一個Java字符串,看起來像這樣;Java正則表達式分隔符和保留分隔符之間的字符串

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

而且我想將此字符串從分隔符(fname:jon)<here>(lname:doe)中分開。

我試圖通過拆分正則表達式\)\(但它只是打破我的代碼

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

輸出

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

我也看了一下這個問題:How to split a string, but also keep the delimiters?,但它並沒有在我的情況,因爲幫助,我想保持分隔符)(並且均勻地分隔分隔符,即第一個括號應該是第一個結果,第二個結果是第二個。

,我用正則表達式是s.split("(?<=\\)\\()"),它給了輸出:

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

這是我想要的輸出:

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

嘗試')' –

+0

@WiktorStribiżew我已經明確指出爲什麼回答沒有幫助在我的情況。你能告訴我爲什麼這是重複的嗎? – Cupid

+0

概括所有這些情況的答案是http://stackoverflow.com/a/2848147/3832970。從底部的第三個是你的情況。 –

回答

7

可以使用正向前查找並積極回顧後這樣分割你的字符串:

正則表達式(?<=\))(?=\()

DEMO

  1. (?<=\))正回顧後其指示右括號應preceed分割位置。
  2. (?=\()積極的lookahead,表明開放支架應該遵循該分割位置。

輸出

(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

刪除沒有意義的'。{0}' - 它沒有任何效果,而且你不正確:在這裏沒有匹配的「空」字符,空字符是''\ 0''。匹配是基於四處查看的*字符之間的*,這沒什麼特別的。 – Bohemian

+0

@Bohemian我原本保留'。{0}'只是爲了表明*這是分隔符*。空我實際上是指*積極lookahead和積極lookbehind *之間的空位。不過,謝謝你指出,我已經相應地更新了我的答案。 –

+0

你還沒有真正更新你的所有帖子,特別是第一句話 – Bohemian

7

您可以使用正回顧後負前瞻來實現這一目標:

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) 
相關問題