2015-02-08 87 views
0

我想分割一些使用String.split()的字符串。带2个分隔符的Java分割字符串

我希望它根据字符分割字符串:"++""+"。例如,"1 + 1"将被拆分为{1, +, 1}"1 ++ 1"将被拆分成​​。我写这条线拆分文本:但它并不适用于"1 ++ 1"工作(输出:{ 1, +, +, 1 }):

String[] temp = tokens.split("(?<=(\\++)|(\\+))|(?=(\\++)|(\\+))"); 

这为"1 + 1"{ 1, +, 1 }输出)工作正常。我知道我可以把它转换成一个ArrayList,然后找到一个"+"后跟一个"+",然后简单地将它们组合成一个令牌,但是我很好奇它是否可以用split()来做到这一点?

+0

你的标记之间总是有空格吗?如果是,那么'split(“\\ s +”)'会更简单。 – Pshemo 2015-02-08 19:37:40

+0

尝试使用贪婪的量词“*”。没有测试过:(\\ +)* – ccleve 2015-02-08 19:37:48

+0

不,我想保留它,以便它可以是1 ++ 1或1 ++ 1或1+ 1等。 – 2015-02-08 19:38:43

回答

1

你可以尝试拆分零个或多个空格具有

  • 位之前它和运营商之后,它像12|+ 32(我打上这样放置|)之前
  • 或操作员和之后12 ++|32位。

将拆分可以像

split("(?<=\\d)\\s*(?=[+])|(?<=[+])\\s*(?=\\d)") 

DEMO:

String[] data = {"1++1" , "1 ++1", "1+ 1"}; 
for (String str : data){ 
    for (String token : str.split("(?<=\\d)\\s*(?=[+])|(?<=[+])\\s*(?=\\d)")){ 
     System.out.println("token: <"+token+">"); 
    } 
    System.out.println("--------"); 
} 

输出(I包围令牌与<>告诉你,他们也摆脱空格):

token: <1> 
token: <++> 
token: <1> 
-------- 
token: <1> 
token: <++> 
token: <1> 
-------- 
token: <1> 
token: <+> 
token: <1> 
-------- 
+0

我不是依靠空间,我只是删除它们,如果有任何(通知我使用'*',这意味着*零或更多*不'''这意味着*一次或更多*) – Pshemo 2015-02-08 19:46:19

+0

对不起,我花了一个其次要了解代码是如何工作的,但我了解它如何不依赖于空间。 – 2015-02-08 19:48:54

0

贪婪Ÿ量词为我工作:

String [] cases = { "1+1", "1++1" }; 
for (String str: cases) { 
    String out [] = str.split("(\\+)*"); 
    System.out.println(Arrays.asList(out)); 
} 

产生:

[1, , 1] 
[1, , 1] 

如果不剪,然后发布多个测试案例。

+1

“*例如,”1 + 1“会被分成”{1,+,1}“,您的解决方案不会产生这个结果。 – Pshemo 2015-02-08 19:49:21

+0

它分裂它,但正如Pshemo指出,它不保留“+”或“++”。我尝试添加lookaheads?<=,?<并将分割转换为正则表达式“(?<=(\\ +)*)|(?=(\\ +)*)”,但会引发异常。 – 2015-02-08 19:52:58