回答:
同じ理由で
",test" split ','
そして
",test," split ','
サイズ2の配列が返されます。最初の一致の前のすべてが最初の要素として返されます。
"".split("wtf").length
は0を返します。JSでは1のみです。:/
"," split ","
0の配列を返すのですか?
オレンジを0回に分割すると、オレンジが1つになります。
"orange".split(',')
がありますが、空の文字列の分割には明らかに関係ありません。オレンジ不足をゼロ回に分けても、オレンジはまだありません。私たちはそれをオレンジ色の空のリスト、ちょうど1つのオレンジ色のリスト、12個のオレンジ色のリスト、または何として表現しますか?それは私たちが最終的に何になるのかではなく、それをどのように表現するかという問題ではありません。
JavaとScalaのsplitメソッドは、次のような2つのステップで動作します。
",,,".split(",")
空の配列を返す理由です。これによると"".split(",")
、2番目のステップのために、結果は空の配列になるはずですよね?
そうすべき。残念ながら、これは人為的に導入されたコーナーケースです。そして、それは悪いことですが、少なくともドキュメントに記載されているjava.util.regex.Pattern
ので、ドキュメントを確認することを忘れないでください。
n == 0の場合、結果はn <0の場合と同じですが、末尾の空の文字列は返されません。(上記のように、入力自体が空の文字列である場合は特別であり、limitパラメーターは適用されないことに注意してください。)
したがって、n == -1
具体的に何を実現したいのかがわかっていなければ、常に2番目のパラメーターとして渡すことをお勧めします(これにより、上記のステップ2はスキップされます)。空の文字列は、プログラムが入力として取得するものではないことが確実です。
プロジェクトですでにGuavaを使用している場合は、Splitter(ドキュメント)クラスを試すことができます。非常に豊富なAPIがあり、コードを非常に簡単に理解できます。
Splitter.on(".").split(".a.b.c.") // "", "a", "b", "c", ""
Splitter.on(",").omitEmptyStrings().split("a,,b,,c") // "a", "b", "c"
Splitter.on(CharMatcher.anyOf(",.")).split("a,b.c") // "a", "b", "c"
Splitter.onPattern("=>?").split("a=b=>c") // "a", "b", "c"
Splitter.on(",").limit(2).split("a,b,c") // "a", "b,c"
"".split (",", n)
Oracle JDK 8を使用して、nの(-1、0、1)の1要素の配列を生成します。空でないトークンのみのリストを取得すると便利です。完全な正規表現が必要な場合があります(など"[^,\\s]+[^,]*[^,\\s]*"
)。
すべてのプログラミング言語で、空白の文字列が依然として有効な文字列であることを知っています。したがって、区切り文字を使用して分割を行うと、常に、その要素が空の文字列である単一の要素配列が返されます。null(空白ではない)文字列の場合は、別の問題になります。
このsplit
動作はJavaから継承され、良くも悪くも...
ScalaはString
プリミティブからの定義をオーバーライドしません。
引数を使用しlimit
て動作を変更できることに注意してください。
limitパラメータは、パターンが適用される回数を制御するため、結果の配列の長さに影響します。制限nがゼロより大きい場合、パターンは最大n-1回適用され、配列の長さはn以下であり、配列の最後のエントリには、最後に一致した区切り文字を超えるすべての入力が含まれます。nが正でない場合、パターンは可能な限り何度も適用され、配列は任意の長さにすることができます。nがゼロの場合、パターンは可能な限り何度も適用され、配列は任意の長さにすることができ、末尾の空の文字列は破棄されます。
つまりlimit=-1
、(すべて?)他の言語の動作を取得するようにを設定できます。
@ ",a,,b,,".split(",")
res1: Array[String] = Array("", "a", "", "b")
@ ",a,,b,,".split(",", -1) // limit=-1
res2: Array[String] = Array("", "a", "", "b", "", "")
Javaの動作が非常にわかりにくいことはよく知られているようですが、次のようになります。
上記の動作は、少なくともJava 5からJava 8で観察できます。
JDK-6559590で空の文字列を分割するときに空の配列を返すように動作を変更する試みがありました。ただし、JDK-8028321では、さまざまな場所でリグレッションが発生するとすぐに元に戻りました。この変更は、最初のJava 8リリースには含まれません。
注:splitメソッドは最初からJava にはありませんでしたが(1.0.2にはありません)、実際には少なくとも1.4から存在しています(たとえば、2002年頃のJSR51を参照)。まだ調査中です...
どのような不明瞭なのは、Javaが最初の場所でこれを選んだ理由(私の疑いが、それは元々 「エッジケース」で監督/バグだったということです)ですが、今取消不能の言語にとて焼き、それが残っています。
"".split(",")
ような単一の要素配列を返します[""]
。