Java字符串 - 在空间上拆分,但保留双倍空间

时间:2012-07-03 18:19:15

标签: java string split

目前我正在按空格分割字符串。然而,当我把它们全部重新组合在一起时,我想保留一些双重空间。有关如何做到这一点的任何建议吗?

即。字符串"I went to the beach. I ate pie"将被拆分为

I
went
to
the
beach.

I
ate
pie

我不想要空白条目,但我想将它们重新组合成相同的格式。谢谢大家!

5 个答案:

答案 0 :(得分:3)

执行字符串replaceAll(“”,“impossibleCharacterSequence”),然后像往常一样用空格分割字符串。然后你可以通过在最后用{“替换你的{impossibleCharacterSequence}来转换回双倍空间。

但是:如果您在实际的未经修改的字符串中遇到“不太可能”的字符序列,则会失败。有关更通用的解决方案,请查看此示例下方列出的替代方案。

示例(警告,取决于不存在!@#!@#:

String example = "Hello.  That was a double space. That was a single space."
String formatted = example.replace("  ", " !@#!@#");
String [] split = formatted.split(" ");
for(int i = 0; i < split.length; i++)
{
  split.replace("!@#!@#", " ");
}
// 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];
}

答案 1 :(得分:2)

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,以便了解这是做什么的。

答案 2 :(得分:1)

详细了解Java的正则表达式可以为您做些什么。有一种方法可以使用正则表达式识别模式。

Java regex examples

答案 3 :(得分:1)

试试这个,它应该删除非空格字符之间的所有空格。

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

当它们在两个单词之间出现一次以上时,这将保留空白区域。

答案 4 :(得分: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 Pattern API:
http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html



旁注: 虽然“用完全难以置信的东西替换文字”的建议很诱人,因为它很容易,不要 永远 在生产代码中执行此操作。 最终将失败,而且它的发生频率超出您的想象。在程序员使用大约80列的“〜= $〜= $〜= $ ...”后,我调试了一个呼叫中心,认为这是安全的。这持续了几个月,直到服务代表用他的笔记保存了一个“花哨的边界”。我甚至在搜索服务器上目睹了一次真正随机的MD5碰撞。当然,MD5碰撞花了11年时间,但它仍然在搜索中崩溃,重点仍然存在。 永远不会有独特的字符串。始终假设将出现重复项。