2012-07-03 103 views
2

目前,我正在用空格拆分字符串。然而,當我將它們全部放回到一起時,我想保留一些雙重空間。有關如何做到這一點的任何建議?Java字符串 - 在空間上拆分,但保留雙倍空間

I.e.字符串"I went to the beach. I ate pie"是越來越分裂爲

I 
went 
to 
the 
beach. 

I 
ate 
pie 

我不想空白的項目,但我想要把它重新走到一起,以相同的格式。謝謝大家!

+0

聽起來好像是你可以使用的StringTokenizer(用空格分開),只是附加到任何非字母字符的空間。 – alfasin

+0

你能保留每個令牌末尾的空格嗎?這將有一個非常簡單的編程解決方案。 –

回答

3

做一個String的replaceAll(」」, 「unlikelyCharacterSequence」),然後按空格作爲正常分裂您的字符串。然後,您可以通過在最後用「」替換您的{不可靠的字符序列}來將其轉換回雙倍空間。

但是:如果您在實際未修改的字符串中遇到「不太可能」的字符序列,這將失敗。對於更通用的解決方案,請檢查下面列出的這個例子。

例(警告,取決於非所有腦幹@#@#:!

String example = "Hello. That was a double space. That was a single space." 
String formatted = example.replace(" ", " [email protected]#[email protected]#"); 
String [] split = formatted.split(" "); 
for(int i = 0; i < split.length; i++) 
{ 
    split.replace("[email protected]#[email protected]#", " "); 
} 
// Recombine your splits? 

另外,您可以爲您在您的問題,但忽略元素都有其採取重組串的更穩健策略只包含一個空格:

String example = "ThisShouldBeTwoElements. ButItIsNot."; 
String [] splitString = example.split(" "); 
String recombined = ""; 
for(int i = 0; i < splitString.length; i++) 
{ 
    if(!splitString[i].equals(" ")) 
    recombined += splitString[i]; 
} 
+3

如果字符串包含char%,該怎麼辦? –

+0

好點!嘗試並選擇不在字符串中的字符,否則我會想出更好的解決方案並對其進行編輯。 – BlackVegetable

+1

@KingsIndian所以用%%% :))) – alfasin

2

仔細看看Java的Regex能爲您做些什麼。有一種方法可以使用正則表達式來識別模式。

Java regex examples

1

試試這個,應該刪除所有的白色空間,是非空白字符之間

myString = myString.replaceAll("\S\s\S", ""); 

這將在兩個單詞之間出現多次時保留空格。

0

我知道這是一個老問題,但對於未來受衆的好處:你正在尋找的概念是「捕獲組」。捕獲組允許您引用表達式中的匹配項,並在稍後檢索它們,例如通過反向引用,而不是被吞下的字符串。

從文檔,這裏就是你需要知道的相關語法:

(?<name>X)   X, as a named-capturing group 
(?:X)    X, as a non-capturing group 
(?idmsuxU-idmsuxU) Nothing, but turns match flags i d m s u x U on - off 
(?idmsux-idmsux:X) X, as a non-capturing group with the given flags i d m s u x on - off 
(?=X)    X, via zero-width positive lookahead 
(?!X)    X, via zero-width negative lookahead 
(?<=X)    X, via zero-width positive lookbehind 
(?<!X)    X, via zero-width negative lookbehind 
(?>X)    X, as an independent, non-capturing group 

使用輸入文本:

String example = "ABC  DEF  GHI J K"; 

您可以使用一個正的和負前瞻組合到結尾的空白結合每個單詞:

// Result: [ABC  , DEF  , GHI , J , K] 
example.split("(?<=\\s+)(?!\\s)"); 

或者您也可以用積極的字邊界捕捉前瞻保留的空間作爲單獨的,分組元素:

// Result: [ABC,  , DEF,  , GHI, , J, , K] 
example.split("(?=\\b)"); 

的Java模式API:
http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html



側面說明:雖然「代替的東西文本完全不可信」的建議很誘人,因爲它很容易,不不斷在生產代碼中做到這一點。它失敗,最終,它往往比你想象的發生。在程序員使用大約80列「〜= $〜= $〜= $ ...」後,我調試了一個呼叫中心,認爲這是安全的。這持續了幾個月,直到服務代表以他的筆記在他的筆記上保存了一個「奇特的邊框」。我甚至目睹了搜索服務器上真正的,隨機的MD5衝突。當然,MD5碰撞花費了11年時間,但它仍然使搜索崩潰,而且仍然存在。 獨特的字符串永遠不會。始終假定重複出現。