![](/img/trans.png)
[英]Split Java String by space and not by double quotation (") that includes space
[英]Java string - split on space, but preserve double space
目前,我正在按空格分割字符串。 但是,当我将它们放回原处时,我想保留一些双空格。 有关如何做到这一点的任何建议?
即字符串"I went to the beach. I ate pie"
被拆分为
I
went
to
the
beach.
I
ate
pie
我不需要空白条目,但我想将其放回相同的格式。 谢谢大家!
做一个字符串replaceAll(“”,“可能性不大的字符序列”),然后像平常一样用空格分割您的字符串。 然后,您可以通过将{unlikelyCharacterSequence}末尾替换为“”来转换回双倍空格。
但是:如果您在未修改的实际String中遇到“不太可能”的字符序列,这将失败。 对于更通用的解决方案,请检查此示例下面列出的替代方法。
示例(警告,取决于!@#!@#的不存在:
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,以便您了解这样做的意思。
仔细看看Java的Regex能为您做什么。 有一种使用正则表达式来确认模式的方法。
尝试此操作,它应删除非空白字符之间的所有空白。
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)");
Java模式API:
http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html
边注:虽然“替换一些完全令人难以置信的文字”的建议很诱人,因为它很容易, 永远不要做,在生产代码。 它最终将失败,并且发生的频率超出您的想象。 在程序员使用大约80列的“〜= $〜= $〜= $ ...”后,我调试了一个呼叫中心,认为这是安全的。 持续了几个月,直到服务代表按此顺序在他的笔记上保存了“花哨的边框”。 我什至在搜索服务器上目睹了一次真正的随机MD5冲突。 诚然,MD5碰撞历时11年,但仍使搜索崩溃,并且问题依然存在。 唯一的字符串永远不会。 始终假定将出现重复项。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.