我喜欢StringTokenizer的想法,因为它是可枚举的。
但是它也已过时,并替换为String.split,它返回无聊的String [](并且不包括定界符)。
因此,我实现了一个StringIterable,它是一个Iterable,并使用一个真正的正则表达式来拆分字符串。
真正的正则表达式表示它不是重复的“字符序列”以形成定界符:
“ o”仅匹配“ o”,并将“ ooo”分为三个定界符,其中包含两个空字符串:
[o], '', [o], '', [o]
但是,正则表达式o +在拆分“ aooob”时将返回预期结果
[], 'a', [ooo], 'b', []
要使用此StringTokenizerExEx:
final StringTokenizerEx aStringTokenizerEx = new StringTokenizerEx("boo:and:foo", "o+");
final String firstDelimiter = aStringTokenizerEx.getDelimiter();
for(String aString: aStringTokenizerEx )
{
// uses the split String detected and memorized in 'aString'
final nextDelimiter = aStringTokenizerEx.getDelimiter();
}
此类的代码可在DZone摘录中获得。
与通常的代码挑战响应(一个包含测试用例的自包含类)一样,将其复制粘贴(在“ src / test”目录中)并运行它。它的main()方法说明了不同的用法。
注意:(2009年后期编辑)
文章最终思想:Java难题者:分裂头发很好地解释了中的怪异行为String.split()
。
乔什·布洛赫(Josh Bloch)甚至对这篇文章发表了评论:
是的,这很痛苦。FWIW,这样做的理由非常充分:与Perl兼容。
做到这一点的人是Mike“ madbot” McCloskey,他现在在Google与我们合作。Mike确保Java的正则表达式实际上通过了30K Perl正则表达式测试中的每一个(并且运行得更快)。
Google 通用图书馆Guava还包含一个Splitter,它是:
因此可能值得检查。从最初的原始文档(pdf):
JDK具有以下功能:
String[] pieces = "foo.bar".split("\\.");
如果需要确切的功能,可以使用它:-正则表达式-结果作为数组-处理空块的方式
迷你益智游戏:“,a ,, b,”。split(“,”)返回...
(a) "", "a", "", "b", ""
(b) null, "a", null, "b", null
(c) "a", null, "b"
(d) "a", "b"
(e) None of the above
答案:(e)以上都不是。
",a,,b,".split(",")
returns
"", "a", "", "b"
仅跳过尾随的容器!(谁知道解决方法可以防止跳过?这很有趣...)
无论如何,我们的Splitter都更加灵活:默认行为很简单:
Splitter.on(',').split(" foo, ,bar, quux,")
--> [" foo", " ", "bar", " quux", ""]
如果您需要其他功能,请提出要求!
Splitter.on(',')
.trimResults()
.omitEmptyStrings()
.split(" foo, ,bar, quux,")
--> ["foo", "bar", "quux"]
配置方法的顺序无关紧要-在拆分期间,修剪会在检查空之前进行。