2015-02-08 124 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