目前我正在通过空格来分割字符串。但是有一些双空格我想在将它们全部组合在一起时保留下来。有什么建议吗?
例如,字符串"I went to the beach. I ate pie"
被分割为
I
went
to
the
beach.
I
ate
pie
我不想要空白条目,但我希望将其按照相同的格式重新组合。感谢大家!
目前我正在通过空格来分割字符串。但是有一些双空格我想在将它们全部组合在一起时保留下来。有什么建议吗?
例如,字符串"I went to the beach. I ate pie"
被分割为
I
went
to
the
beach.
I
ate
pie
可以使用String的replaceAll(" ", " unlikelyCharacterSequence")方法将字符串中的双空格替换为一个不太可能出现的字符序列,然后按照正常方式通过空格对字符串进行分割。最后,您可以通过在末尾将{unlikelyCharacterSequence}替换为双空格来将其转换回去。
但是:如果您在实际未修改的字符串中遇到了您的“不太可能”的字符序列,则此方法会失败。为了更通用的解决方案,请查看下面这个示例的备选方案。
示例(警告,取决于不存在!@ #!@#:)
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];
}
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,以便您了解这个程序的作用。
请尝试使用此方法,它可以删除非空格字符之间的所有空格。
myString = myString.replaceAll("\S\s\S", "");
这将在两个单词之间出现多个空格时保留它们。
我知道这是一个老问题,但是为了未来的读者受益:你要寻找的概念是“捕获组”。捕获组允许您引用表达式中的匹配项,并稍后检索它们,例如通过反向引用,而不是字符串被吞噬。
从文档中,这是您需要了解的相关语法:
(?<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)");