5

私は2つの正規表現を持っています:

[a-c] : any character from a-c

[a-z] : any character from a-z

そしてテスト:

public static void main(String[] args) {
    String s = "abcde";
    String[] arr1 = s.split("[a-c]");
    String[] arr2 = s.split("[a-z]");

    System.out.println(arr1.length); //prints 4 : "", "", "", "de"
    System.out.println(arr2.length); //prints 0 
}

2 番目の分割がこのように動作するのはなぜですか? 6 つの空の文字列 "" の結果を含む結果が期待されます。

4

3 に答える 3

9

single-argument のドキュメントにString.splitよると:

splitこのメソッドは、指定された式とゼロの制限引数を使用して 2 つの引数のメソッドを呼び出すかのように機能します。したがって、後続の空の文字列は、結果の配列には含まれません。

末尾の文字列を保持するには、引数が 2 つのバージョンを使用して、負の制限を指定します。

    String s = "abcde";
    String[] arr1 = s.split("[a-c]", -1); // ["", "", "", "de"]
    String[] arr2 = s.split("[a-z]", -1); // ["", "", "", "", "", ""]
于 2013-07-19T19:55:11.203 に答える
5

デフォルトでは、split末尾の空の文字列を破棄します。このarr2場合、それらはすべて空の文字列の末尾にあったため、すべて破棄されました。

split6 個の空の文字列を取得するには、メソッドの 2 番目のパラメーターとして負の制限を渡します。これにより、後続のすべての空の文字列が保持されます。

String[] arr2 = s.split("[a-z]", -1);

n が正でない場合、パターンは可能な限り何度でも適用され、配列は任意の長さにすることができます。

于 2013-07-19T19:55:05.367 に答える
0

String.split():

指定された正規表現の一致に基づいてこの文字列を分割します。

周囲は、一致自体が削除されることを意味します。たとえば、"a,b,c" をコンマで分割すると、 and と同じようになりaます。bc

最初の分割では、a、b、および c が削除されます。

2 番目はすべての文字を削除するため、その文字列からすべての文字が削除されます。

于 2013-07-19T19:55:28.943 に答える