目前我正在按空格分割字符串。然而,当我把它们全部重新组合在一起时,我想保留一些双重空间。有关如何做到这一点的任何建议吗?
即。字符串"I went to the beach. I ate pie"
将被拆分为
I
went
to
the
beach.
I
ate
pie
我不想要空白条目,但我想将它们重新组合成相同的格式。谢谢大家!
答案 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的正则表达式可以为您做些什么。有一种方法可以使用正则表达式识别模式。
答案 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年时间,但它仍然在搜索中崩溃,重点仍然存在。 永远不会有独特的字符串。始终假设将出现重复项。