目前,我正在用空格拆分字符串。然而,當我將它們全部放回到一起時,我想保留一些雙重空間。有關如何做到這一點的任何建議?Java字符串 - 在空間上拆分,但保留雙倍空間
I.e.字符串"I went to the beach. I ate pie"
是越來越分裂爲
I
went
to
the
beach.
I
ate
pie
我不想空白的項目,但我想要把它重新走到一起,以相同的格式。謝謝大家!
目前,我正在用空格拆分字符串。然而,當我將它們全部放回到一起時,我想保留一些雙重空間。有關如何做到這一點的任何建議?Java字符串 - 在空間上拆分,但保留雙倍空間
I.e.字符串"I went to the beach. I ate pie"
是越來越分裂爲
I
went
to
the
beach.
I
ate
pie
我不想空白的項目,但我想要把它重新走到一起,以相同的格式。謝謝大家!
做一個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];
}
如果字符串包含char%,該怎麼辦? –
好點!嘗試並選擇不在字符串中的字符,否則我會想出更好的解決方案並對其進行編輯。 – BlackVegetable
@KingsIndian所以用%%% :))) – alfasin
仔細看看Java的Regex能爲您做些什麼。有一種方法可以使用正則表達式來識別模式。
試試這個,應該刪除所有的白色空間,是非空白字符之間
myString = myString.replaceAll("\S\s\S", "");
。
這將在兩個單詞之間出現多次時保留空格。
String st = "I went to the beach. I ate pie";
st.split("\\s{1}(?!\\s)");
這導致
[I, went, to, the, beach. , I, ate, pie]
我也建議看http://docs.oracle.com/javase/6/docs/api/和/或http://www.regular-expressions.info/java.html所以你明白這是什麼在做什麼。
我知道這是一個老問題,但對於未來受衆的好處:你正在尋找的概念是「捕獲組」。捕獲組允許您引用表達式中的匹配項,並在稍後檢索它們,例如通過反向引用,而不是被吞下的字符串。
從文檔,這裏就是你需要知道的相關語法:
(?<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年時間,但它仍然使搜索崩潰,而且仍然存在。 獨特的字符串永遠不會。始終假定重複出現。
聽起來好像是你可以使用的StringTokenizer(用空格分開),只是附加到任何非字母字符的空間。 – alfasin
你能保留每個令牌末尾的空格嗎?這將有一個非常簡單的編程解決方案。 –