2014-09-02 3 views
4

String.Contains가 true를 반환하고 String.LastIndexOf가 -1을 반환하는 문제가 있습니다. 누군가 나에게 어떤 일이 일어 났는지 설명 할 수 있을까요? .NET 4.5 사용하고 있습니다.String.Contains 및 String.LastIndexOf C#이 다른 결과를 반환합니까?

static void Main(string[] args) 
    { 
     String wikiPageUrl = @"http://it.wikipedia.org/wiki/ʿAbd_Allāh_al-Sallāl"; 

     if (wikiPageUrl.Contains("wikipedia.org/wiki/")) 
     { 

      int i = wikiPageUrl.LastIndexOf("wikipedia.org/wiki/"); 

      Console.WriteLine(i); 

     } 
    } 
+0

직접 C & P 인 경우 컴파일되지 않습니다. 직접 C & P가 아니라면 왜 안 되니? – John3136

+0

예상대로 [10]을 반환합니다 ([demo] (http://ideone.com/qYl3sZ)). 투표가 재현 불가능으로 마감되었습니다. – dasblinkenlight

+0

코드가 컴파일되지 않습니다. 나는 인용 부호가 유니 코드 문자라고 생각한다. – Hassan

답변

3

이 각 string에 해당 chars의 숫자 값을 평가하여 string를 비교합니다 StringComparison.Ordinal

를 사용해보십시오, 이것은 당신이 그 예에있는 특수 chars와 함께 작동합니다 string

string wikiPageUrl = @"http://it.wikipedia.org/wiki/ʿAbd_Allāh_al-Sallāl"; 
int i = wikiPageUrl.LastIndexOf("http://it.wikipedia.org/wiki/", StringComparison.Ordinal); 

// 0을 반환합니다.

0

' 문자가 버립니다.

당신이 '\'로 탈출 할 때이 작동합니다 : 당신이 (:)이 '을 제거, 이스케이프, 또는 깊이 파고) 수행 할 작업을

wikiPageUrl = @"http://it.wikipedia.org/wiki/\'Abd_Allāh_al-Sallāl"; 

if (wikiPageUrl.Contains("wikipedia.org/wiki/")) 
{ 
    "contains".Dump(); 
    int i = wikiPageUrl.LastIndexOf("wikipedia.org/wiki/"); 

    Console.WriteLine(i); 

} 

그림을.

+0

전체 Wikipedia에서 작업을 실행하고 있는데 wikiPageUrl은 내가 전처리하고 싶지 않은 데이터베이스. 나는 주위에 몇 가지 작업을 이미 가지고 있지만 "true"를 반환하고 LastIndexOf가 "-1"을 반환하는 이유를 알고 싶습니다 – user3430150

2

그 물건은 뒤에서 보이는 C# lastindexof입니다.

wikipedia.org/wiki/ 다음에 이스케이프 시퀀스로 사용되는 '이옵니다. 그러므로 wiki/ 다음에 '을 삭제하거나 @도 제출하십시오. 당신은 당신이 어떤 작업을 수행하기 전에이 문제에 대한 일반화 된 솔루션이 문자열에 @''을 교체하려는 경우

다음 구문은

string wikiPageUrl = @"http://it.wikipedia.org/wiki/Abd_Allāh_al-Sallāl"; 

string wikiPageUrl = @"http://it.wikipedia.org/wiki/@ʿAbd_Allāh_al-Sallāl"; 

int i = wikiPageUrl.LastIndexOf("wikipedia.org/wiki"); 

모든 3 개 작품

(사람이) 작동합니다.

5

@sa_ddam213's answer은 분명히이 문제를 해결하지만,이 특정 문자열에 대해 정확히 이해하는 데 도움이 될 수 있습니다.

다른 "특수 문자"로 예제를 시도해도 문제가 발생하지 않습니다.

string url1 = @"http://it.wikipedia.org/wiki/»Abd_Allāh_al-Sallāl"; 
Console.WriteLine(url1.LastIndexOf("it.wikipedia.org/wiki/")); // 7 

string url2 = @"http://it.wikipedia.org/wiki/~Abd_Allāh_al-Sallāl"; 
Console.WriteLine(url2.LastIndexOf("it.wikipedia.org/wiki/")); // 7 

문제의 문자, " '"는 spacing modifier letter1라고 예를 들어, 다음 문자열은 예상대로 작동합니다. 공백 수정 기호 문자는 독자적으로 서 있지 않지만 문자열의 이전의 문자 (이 경우 "/")를 수정합니다. 이것을 넣는 또 다른 방법은 렌더링 될 때 자신의 공간을 차지하지 않는다는 것입니다.

LastIndexOfStringComparison 인수없이 호출 할 때 현재 문화권을 사용하여 문자열을 비교합니다.

문자열을 문화적으로 의미있는 방식으로 비교할 때 "/"및 " '"문자는 두 개의 별개 문자로 인식되지 않습니다. 문자가 한 문자로 처리되며 은 일치하지 않습니다. 매개 변수가 전달되었습니다. 에서 LastIndexOf.

StringComparison.OrdinalLastIndexOf으로 전달하면 서수 비교의 특성상 문자가 별개로 취급됩니다.

이 작품은 CompareInfo.LastIndexOf을 사용하고 CompareOptions.IgnoreNonSpace 옵션을 제공하는 것입니다 수 있도록하는 또 다른 방법 : 우리는 우리가 문자를 결합하여 우리의 문자열 비교에 포함하지 않을 말을하는지 여기

Console.WriteLine(
    CultureInfo.CurrentCulture.CompareInfo.LastIndexOf(
     wikiPageUrl, @"it.wikipedia.org/wiki/", CompareOptions.IgnoreNonSpace)); 
// 7 

합니다. (!) 참고로

,이 캐릭터가 LastIndexOf에 전달되는 검색 문자열에 표시되지 않는 문자에 적용되고 있기 때문에 @Partha's answer@Noctis' answer 만 작동을 의미합니다.

대조적으로 Contains 메서드와 비교합니다.이 메서드는 기본적으로 서수 (대/소문자를 구분하고 에 민감 함) 비교를 수행합니다. 이것은 Containstrue을 반환하고 LastIndexOffalse을 반환하는 이유를 설명합니다.

.NET 프레임 워크에서 문자열을 조작하는 방법에 대한 환상적인 개요는 this article을 확인하십시오.


1 : 이것은 결합 문자 다른인가 또는 문자를 조합의 유형입니까? 누군가가 저를 위해 그것을 정리한다면 감사 할 것입니다.

+0

+1, 좋은 세부 사항, 많이 배웠습니다 :) –

+0

아주 좋은 답변 :) – Noctis