"abcd".StartsWith ( "")가 true를 반환하는 이유는 무엇입니까?


88

제목은 전체 질문입니다. 누군가가 이런 일이 발생하는 이유를 알려줄 수 있습니까?

답변:


164

예-빈 문자열로 시작하기 때문입니다. 실제로 빈 문자열은 모든 문자 쌍 사이에 논리적으로 발생합니다.

이렇게 말하면 "시작"의 어떤 정의가이를 배제 할 수 있습니까? 다음은 그렇지 않은 "시작"에 대한 간단한 정의입니다.

"x의 첫 y.Length문자 가 y의 문자와 일치 하면 x는 y로 시작합니다 ."

대체 (동등한) 정의 :

"x는 y로 시작하면 x.Substring(0, y.Length).Equals(y)"


3
X와 Y 시작 x.Substring (0 y.Length) .Equals (Y)의 경우 경우에만 y.Length> 0 인 경우
Vinko Vrsalovic

8
예,이 경우를 명시 적으로 제외 할 수 있습니다. 그래도 꽤 우아하지 않은 정의 죠?
Jon Skeet

7
진실. 또한 null이 아니어야합니다.하지만이 두 가지 모두 정확성을
높이

8
빈 문자열의 무한 발생은 모든 문자 쌍 사이에 발생합니다.
Lotus Notes

3
예, 숫자 앞에 0을 넣는 것과 같습니다. 값은 변경되지 않지만 여전히 존재합니다.
pop850 2010-08-10

47

나는 Jon Skeet가 말한 것에 대해 자세히 설명하려고 노력할 것입니다.

x, y 및 z가 문자열이고 + 연산자가 실제로 연결이라고 가정 해 보겠습니다.

z를 분할하여 z = x + y를 쓸 수 있다면 z가 x로 시작 함을 의미합니다. 모든 문자열 z는 z = ""+ z로 분할 될 수 있으므로 모든 문자열이 ""로 시작합니다.

따라서 ( ""+ "abcd") == "abcd"이므로 "abcd"는 ""로 시작합니다.


18

이해하기 쉬운 관련 사실부터 시작하겠습니다.

빈 집합은 모든 집합의 하위 집합입니다.

왜? 정의서브 세트 상태 A의 부분 집합 B의 모든 요소가있는 경우 A의 원소이다 B. 반대로 의 요소 가 아닌 요소가있는 경우 A의 하위 집합 이 아닙니다 .BAB

이제 세트를 수정하십시오 B. 빈 집합이 B. 빈 집합이의 하위 집합이 아닌 경우가 아님을 보여줌으로써이를 수행 할 것입니다 B. 빈 집합이의 하위 집합이 아니면에없는 빈 집합 B의 요소를 찾을 수 B있습니다. 그러나 빈 집합에는 요소가 없으므로 .NET에없는 요소를 찾을 수 없습니다 B. 따라서 빈 집합이의 하위 집합이 아닌 것은 아닙니다 B. 따라서 빈 집합은의 하위 집합이어야합니다 B.

모든 문자열은 빈 문자열로 시작합니다.

먼저, 시작 에 대한 정의에 동의해야합니다 . Let sand tbe strings 우리는 if로 s 시작 하고의 첫 문자 가 . 즉, 모든에 대한 그와 같은 , 사실이다. 반대로 if 문으로 시작하지 않는다고 말할 수 있습니다 .ts.Length >= t.Lengtht.Lengthtss.Length >= t.LengthInt32 index0 <= index < t.Lengths[index] == t[index]st

s.Length < t.Length또는 s.Length >= t.Length거기있는 Int32 index그러한 0 <= index < t.Lengths[index] != t[index]

사실이다. 일반 영어에서는 s보다 짧습니다 t. 그렇지 않은 경우 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.Length0과 같으므로 사실이 s.Length < String.Empty.Length될 수 없습니다 . 마찬가지로``String.Empty.Length is equal to zero, there is noInt32 index satisfying0 <= index <String.Empty.Length`. 따라서

s.Length < String.Empty.Length또는 s.Length >= String.Empty.Length및가 Int32 index되도록0 <= index < String.Empty.Length

거짓입니다. 따라서 s빈 문자열로 시작하지 않는 경우 가 아닙니다. 따라서 s빈 문자열로 시작해야합니다.

다음은 의 확장으로 코딩 된 시작 의 구현입니다 string.

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;
}

위의 두 가지 대담한 사실은 막연하게 진실 된 진술의 예입니다 . 그것들을 정의하는 문장 ( 부분 집합과시작 )이 빈 우주에 대한 보편적 인 수량화 라는 사실 때문에 그들은 사실입니다 . 빈 세트에는 요소가 없으므로 다른 고정 세트가 아닌 빈 세트의 요소가있을 수 없습니다. 빈 문자열에는 문자가 없으므로 다른 고정 문자열의 동일한 위치에있는 문자와 일치하지 않는 빈 문자열의 일부 위치로 문자가있을 수 없습니다.


17

이 메서드는 value 매개 변수를 value와 길이가 같은이 문자열의 시작 부분에있는 하위 문자열과 비교하여 같은지 여부를 나타내는 값을 반환합니다. 동일하려면 값이 빈 문자열 (Empty)이거나 동일한 인스턴스에 대한 참조이거나이 인스턴스의 시작과 일치해야합니다.

.NET String.StartsWith

인수가 나타내는 문자 시퀀스가이 문자열이 나타내는 문자 시퀀스의 접두사이면 true이고; 그렇지 않으면 거짓. 인수가 빈 문자열 이거나 equals (Object) 메서드에 의해 결정된이 String 객체와 동일한 경우 true가 반환됩니다 .

자바 String.startsWith


13

"abcd".StartsWith("")false를 반환 한다고합시다 .

그렇다면 다음 표현식은 true 또는 false로 평가됩니다.

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

true로 평가되므로 문자열은 빈 문자열 ;-)로 시작합니다. 즉, 위치 0에서 시작하고 길이가 0 인 "abcd"의 하위 문자열은 빈 문자열 ""과 같습니다. 꽤 논리적 인 imo.


"abcd".Substring (0, 0)이 빈 문자열을 반환한다고해서 "abcd"가 실제로 빈 문자열로 시작한다는 의미는 아닙니다. 결과는 null똑같이 적절한 반환 값이었던 것처럼 '정의되지 않음'으로 선언되었을 수도 있습니다 .
Tom Lint

@TomLint 아니요. 일반적으로 조건을 결합합니다. IE x.FirstName.StartsWith (userEnteredFirstName) && x.LastName.StartsWith (userEnteredLastName) .... 입력 된 valeus 중 하나가 빈 문자열 인 경우에도 조건이 작동합니다.
Pop Catalin

7

C #에서 이것은 사양 이 반응 하도록 지시 하는 방법입니다 .

동일하려면 값이 빈 문자열 (Empty)이거나 동일한 인스턴스에 대한 참조이거나이 인스턴스의 시작과 일치해야합니다.


5

두 문자열의 처음 N 개 문자는 동일합니다. N은 두 번째 문자열의 길이, 즉 0입니다.


5

"abcd".StartsWith ( "")가 true를 반환하는 이유는 무엇입니까?

진정한 답 :

그렇지 않으면 당신은

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

    but yet

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

그런 다음 다시 Y2K를 갖게 될 것입니다. 그 자체로 시작하는 동일한 문자열에 의존하는 모든 은행 소프트웨어가 우리 계좌를 뒤섞을 것이고 갑자기 Bill Gates가 내 부를 갖게 될 것이고 저는 그의 부를 갖게 될 것이기 때문입니다. 운명은 나에게 그런 종류가 아닙니다.


동의하지 않습니다. "".startsWith ( "")는 문자열이 동일하고 이상한 비즈니스 로직 때문이 아니기 때문에 true와 같아야합니다.
Tom Lint

@TomLint 당신은 사실 대답의 주장에 동의하고 있습니다 ...
neonblitzer

4

레코드를 위해 String.StartsWith()내부적 System.Globalization.CultureInfo.IsPrefix()으로 다음을 확인 하는 메서드 를 명시 적으로 호출합니다 .

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

1

문자열은 "nothing"으로 시작하기 때문입니다.


1
... string.empty가 아무것도 아닌 경우입니다! 이 과도한 단순화는 일반화 할 수 없습니다. 나는 우리가 좀 더 설정된 이론 지향적 인 토론을 따르는 것이 좋습니다.
Pita.O

1

정규 표현식 용어로 생각하면 의미가 있습니다. 모든 문자열 ( "abcd"뿐만 아니라 ""및 "sdf \ nff")은 '빈 문자열로 시작'의 정규식을 평가할 때 true를 반환합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.