Enumerableなので、StringTokenizerのアイデアが気に入っています。
しかし、これも時代遅れであり、退屈なString []を返すString.splitに置き換えられます(区切り文字は含まれません)。
そのため、Iterableであり、文字列を分割するために真の正規表現を使用するStringTokenizerExを実装しました。
真の正規表現は、区切り文字を形成するために繰り返される「文字シーケンス」ではないことを意味します。
「o」は「o」にのみ一致し、「ooo」は3つの区切り文字に分割され、2つの空の文字列が含まれます。
[o], '', [o], '', [o]
しかし、正規表現o +は「aooob」を分割するときに期待される結果を返します
[], 'a', [ooo], 'b', []
このStringTokenizerExを使用するには:
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 Snippetsで入手できます。
以下のためいつものように、コード・チャレンジレスポンス(テストケースと1自己完結型のクラスが含まれている)、それをコピー&ペースト(「SRC /テスト」ディレクトリにある)と、それを実行します。main()メソッドは、さまざまな使用法を示しています。
注:(2009年後半の編集)
記事Final Thoughts:Java Puzzler:Splitting Hairsは、の奇妙な振る舞いを説明する良い仕事をしていString.split()
ます。
Josh Blochはその記事に応じてコメントさえしました:
はい、これは苦痛です。FWIW、それは非常に良い理由で行われました:Perlとの互換性。
それをやったのはマイク・マッドボット・マックロスキーで、現在グーグルで働いています。Mikeは、Javaの正規表現が30KのPerl正規表現テストのほぼすべてに合格した(そしてより速く実行された)ことを確認しました。
Google 共通ライブラリGuavaには、次のスプリッターも含まれています。
- 使いやすい
- (ユーザーではなく)Googleが管理
したがって、チェックアウトする価値があるかもしれません。彼らの最初の大まかな文書(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.on(',').split(" foo, ,bar, quux,")
--> [" foo", " ", "bar", " quux", ""]
追加の機能が必要な場合は、それらを求めてください!
Splitter.on(',')
.trimResults()
.omitEmptyStrings()
.split(" foo, ,bar, quux,")
--> ["foo", "bar", "quux"]
configメソッドの順序は重要ではありません。分割中、空を確認する前にトリミングが行われます。