8

このコードがある場合:

"......".Split(new String[]{"...", ".."}, StringSplitOptions.None);

結果の配列要素は次のとおりです。

 1. ""
 2. ""
 3. ""

セパレータの順序を逆にすると、

"......".Split(new String[]{"..", "..."}, StringSplitOptions.None);

結果の配列要素は次のとおりです。

 1. ""
 2. ""
 3. ""
 4. ""

これら 2 つの例から、Split メソッドは、配列の各要素を左から右に処理するときに、再帰的にトークン化すると結論付けたいと思います。

しかし、英数字を含むセパレーターを方程式に入れると、上記の理論が間違っていることは明らかです。

  "5.x.7".Split(new String[]{".x", "x."}, StringSplitOptions.None)

結果:1. "5" 2. ".7"

   "5.x.7".Split(new String[]{"x.", ".x"}, StringSplitOptions.None)

結果:1. "5" 2. ".7"

今回は同じ出力が得られます。これは、最初の一連の例に基づいて理論化されたルールが適用されなくなったことを意味します。(つまり、セパレーターの優先順位が常に配列内のセパレーターの位置に基づいて決定される場合、最後の例では & の代わりに & を"5."取得"7""5"ます".7"

.NET 標準 API の仕組みを推測しようとして時間を無駄にしている理由は、Java アプリに同様の機能を実装したいのですが、StringTokenizer も org.apache.commons.lang.StringUtils も分割する機能を提供していないためです。複数の複数文字の区切り記号を使用する文字列(この機能を提供する API を見つけたとしても、String.Split メソッドで使用されるのと同じアルゴリズムを使用して常にトークン化するかどうかを知ることは困難です。

4

3 に答える 3

7

MSDNから:

セパレータ内の文字列に共通の文字がある場合のあいまいな結果を回避するために、Split 操作はインスタンスの値の先頭から末尾まで進み、インスタンス内のデリミタと等しいセパレータ内の最初の要素と一致します。インスタンス内で部分文字列が検出される順序は、セパレータ内の要素の順序よりも優先されます。

したがって、最初のケースでは、".." と "..." が同じ位置にあり、区切り文字での順序を使用して、使用されるものを決定します。2 番目のケースでは、「.x」が「x」の前に見つかります。また、セパレータ内の要素の順序は適用されません。

于 2013-02-07T23:12:09.693 に答える
1

MakeSeparatorListこれをざっと見てみると、stringクラスのプライベート メソッドが実際にはインデックスの配列を取得しているように見えますが、最初に見つかったものと一致します。

したがって、両方の例で.x前に来るためx.、そのインデックスが保存されます。

これは私がテストに使用したコードです:

var s = "5.x.7";

string[] separators = new string[] { "x.", ".x" };
int[] sepList = new int[1024];
int[] lengthList = new int[1024];

MethodInfo dynMethod = s.GetType().GetMethods(BindingFlags.NonPublic | BindingFlags.Instance).Last(x => x.Name == "MakeSeparatorList");
dynMethod.Invoke(s, new object[] { separators, sepList, lengthList });

Debugger.Break();

このスクリーンショットを参照してください。

(私のスクリーンショットが表示されませんか? :/)

が配列の 2 番目のエントリである.xにもかかわらず、インデックスが 1 であることに注意してください (結果は になります)。.x

于 2013-02-07T23:13:02.820 に答える
0

string .split は、引数に一致する最初の一致文字を分割します。簡単な質問: オプション split("a", "b") を指定し、文字列に "appaleisbigapll" が含まれているとしましょう。アルゴリズムは単純で、最初の文字で始まり、a または b のいずれかと一致します。これらが見つかった場合、分割して次の文字から開始します。あなたの例では

5.x.7 を「.x」、「x.」で。「or」演算子でルールを設定するため、最初に .x が検出され、一致する文字が残っていないため残りの .7 がチェックされ、.7 はそのままになります。結果 5 と .7

.x を見つけた 2 番目の質問でも同じことが起こり、ルールで .x または x と表示されます。.7 に進みます。優先順位はここでは適用されません。そして、最初の一連の例では、はい、分割操作を再帰的に行います。

于 2013-02-07T23:29:11.893 に答える