web-dev-qa-db-ja.com

"abcd" .StartsWith( "")がtrueを返すのはなぜですか?

タイトルは質問全体です。誰かが私にこれが起こる理由を教えてもらえますか?

83
Dested

はい-空の文字列で始まるためです。実際、空の文字列は論理的にすべての文字のペアの間で発生します。

このように言います。これを排除するために、「で始まる」のどのような定義を与えることができますか?これは、「ではない」の単純な定義で、次のようなものはありません。

「xの最初の_y.Length_文字がyの文字と一致する場合、xはyで始まります。」

別の(同等の)定義:

x.Substring(0, y.Length).Equals(y)の場合、xはyで始まります」

163
Jon Skeet

ジョン・スキートの発言について詳しく説明します。

X、y、zが文字列で、+演算子が実際に連結されているとします。

Zを分割してz = x + yと書くことができる場合、zはxで始まることを意味します。すべての文字列zはz = "" + zに分割できるため、すべての文字列は ""で始まります。

したがって、( "" + "abcd")== "abcd"なので、 "abcd"は ""で始まることになります。

46
Petar Repac

このメソッドは、値パラメーターをこの文字列の先頭にある、値と同じ長さの部分文字列と比較し、それらが等しいかどうかを示す値を返します。 等しい場合、値は空の文字列(Empty)、この同じインスタンスへの参照、またはこのインスタンスの先頭と一致する必要があります。

。NET String.StartsWith

引数によって表される文字シーケンスがこの文字列によって表される文字シーケンスの接頭辞である場合はtrue。それ以外の場合はfalse。 また、引数が空の文字列であるか、equals(Object)メソッドで決定されたこのStringオブジェクトと等しい場合、trueが返されることにも注意してください。

Java String.startsWith

17
Firas Assaad

理解しやすい関連事実から始めましょう。

空のセットはすべてのセットのサブセットです。

どうして? definition ofsubsetは、Aのすべての要素がBの要素である場合、ABのサブセットであることを示します。逆に、Aの要素ではないBの要素がある場合、ABのサブセットではありません。

次に、セットBを修正します。空のセットがBのサブセットであることを確認します。空のセットがBのサブセットではないことを示すことで、これを行います。空のセットがBのサブセットでない場合、Bにない空のセットの要素を見つけることができます。しかし、空のセットには要素がないため、Bにない要素を見つけることができません。したがって、空のセットがBのサブセットではないというわけではありません。したがって、空のセットはBのサブセットである必要があります。

すべての文字列は空の文字列で始まります。

最初に、の定義がで始まることに同意する必要があります。 ststringsとしましょうst if s.Length >= t.Lengthで始まり、tの最初のt.Length文字がsの文字と一致すると言います。つまり、s.Length >= t.Length、およびInt32 index0 <= index < t.Lengthとなるようなすべてのs[index] == t[index]についてはtrueです。逆に、次のステートメントの場合、stで始まっていないと言えます

s.Length < t.Lengthまたはs.Length >= t.LengthInt32 indexがあり、0 <= index < t.Lengths[index] != t[index]

本当です。単純な英語では、stよりも短いか、そうでない場合、t内の文字がs内の同じ位置の文字と一致しません。

次に、文字列sを修正します。 sが空の文字列で始まることを確認します。 sが空の文字列で始まっていないわけではないことを示すことで、これを行います。 sが空の文字列で始まっていない場合は、s.Length < String.Empty.Lengthまたはs.Length >= String.Empty.Lengthがあり、Int32 indexがあり、0 <= index < String.Empty.Lengthになります。ただし、s.Length >= 0およびString.Empty.Lengthはゼロに等しいため、s.Length < String.Empty.Lengthがtrueになることは不可能です。同様に、「String.Empty.Lengthis equal to zero, there is noInt32 indexsatisfying0 <= index <String.Empty.Length`。したがって

s.Length < String.Empty.Lengthまたはs.Length >= String.Empty.LengthおよびInt32 indexがあり、0 <= index < String.Empty.Length

は偽です。したがって、sが空の文字列で始まっていないわけではありません。したがって、sは空の文字列で始まる必要があります。

以下は、stringの拡張としてコーディングされたstarts withの実装です。

public static bool DoStartsWith(this string s, string t) {
    if (s.Length >= t.Length) {
        for (int index = 0; index < t.Length; index++) {
            if (s[index] != t[index]) {
                return false;
            }
        }
        return true;
    }
    return false;
}

上記の2つの太字のファクトは 虚偽のステートメント の例です。それらを定義するステートメント(subsetおよびstarts with)は niversal quantifications 空のユニバース。空のセットには要素がないため、他の固定セットにない空のセットの要素は存在できません。空の文字列には文字がないため、空の文字列の一部の位置が他の固定文字列の同じ位置の文字と一致しないため、文字を含めることができません。

17
jason

"abcd".StartsWith("")がfalseを返すとしましょう。

もしそうなら、次の式は真または偽に何を評価しますか:

 ("abcd".Substring(0,0) == "")

evalがtrueであることがわかります。したがって、文字列は空の文字列で始まります;-)、つまり、「abcd」の部分文字列は、位置0から始まり、長さが0であり、空の文字列「」と等しくなります。かなり論理的なイモ。

11
Pop Catalin

C#では、これが 指定 が反応するように指示する方法です。

等しい場合、値は空の文字列(Empty)、この同じインスタンスへの参照、またはこのインスタンスの先頭と一致する必要があります。

7
blowdart

「abcd」.StartsWith(「」)がtrueを返す理由

実際の答え:

そうでなければ、そうでなければあなたはケースを持っているでしょう

    "".startsWith("") == false 
    "".equals("") == true

    but yet

    "a".startsWith("a") == true
    "a".equals("a") == true

それから、Y2Kを繰り返します。なぜなら、同じ文字列に依存するすべての銀行のソフトウェアがアカウントを混乱させ、突然、Bill Gatesが私の財産を手に入れ、私はそれを手に入れるからです。運命は私にはそんなに親切ではありません。

5
user804965

記録のためだけに、String.StartsWith()は内部でメソッドSystem.Globalization.CultureInfo.IsPrefix()を呼び出し、次のチェックを明示的に行います。

if (prefix.Length == 0)
{
    return true;
}
4
Tamas Czinege

2つの文字列の最初のN文字は同一です。 Nは2番目の文字列の長さ、つまりゼロ。

4
Ralph

文字列は「何もない」で始まるからです。

1
gizmo

正規表現で考えると理にかなっています。すべての文字列(「abcd」だけでなく、「」と「sdf\nff」)は、「空の文字列で始まる」の正規表現を評価するとtrueを返します。

1
AA22