2017-03-04 94 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) 
相关问题