대소 문자가 구분되지 않음 '포함 (문자열)'


질문

 

다음과 같은 반환을 할 수있는 방법이 있습니까?

string title = "ASTRINGTOTEST";
title.Contains("string");

내가 사례 감도를 설정할 수있는 과부하 인 과부하 인 것 같습니다.현재 나는 둘 다 대문자이지만 그것은 단지 바보입니다 (내가 위와 아래로 오는 i18n 문제를 언급하고 있습니다).

업데이트

이 질문은 고대이기 때문에 나는 그것을 완전히 조사하고 싶다면 정말로 광범위하고 어려운 주제에 대한 간단한 답변을 요구했다는 것을 깨달았습니다.

대부분의 경우, 모노 - 혀, 영어 코드베이스 에서이 대답은 충분합니다.나는 대부분의 사람들이 여기에 오는이 카테고리에 이르기 때문에 이것은 가장 인기있는 대답입니다.

그러나이 대답은 텍스트가 같은 문화가 있고 우리는 그 문화가 무엇인지 압니다.이것은 어쩌면 인기있는 대답 일 것입니다. 그러나 나는 그것이 더 정확하다고 생각합니다. 그래서 내가 그걸로 표시 한 이유입니다.


답변

 

문자열을 사용하고 문자열 유형으로 stringcomparison.ordinalignorecase를 전달할 수 있습니다.

string title = "STRING";
bool contains = title.IndexOf("string", StringComparison.OrdinalIgnoreCase) >= 0;

더 나은 문자열에 대한 새로운 확장 방법을 정의하는 것입니다.

public static class StringExtensions
{
    public static bool Contains(this string source, string toCheck, StringComparison comp)
    {
        return source?.IndexOf(toCheck, comp) >= 0;
    }
}

주, 그 널 전파는?이전 버전에서는 C # 6.0 (VS 2015) 이후로 사용할 수 있습니다.

if (source == null) return false;
return source.IndexOf(toCheck, comp) >= 0;

용법:

string title = "STRING";
bool contains = title.Contains("string", StringComparison.OrdinalIgnoreCase);


답변

문자열 단락에 문자열 단어가 포함되어 있는지 테스트하려면 (@QuarterMeister)

culture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0

문화는 텍스트가 쓰여진 언어를 설명하는 문화 정보의 인스턴스입니다.

이 솔루션은 언어 의존적 인 경우 대소 문자가 없음의 정의에 대해 투명합니다.예를 들어, 영어 언어는 문자 I 및 i를 제 9 글자의 대문자 및 소문자 버전을 사용하는 반면, 터키어 언어는이 문자를 29 개의 문자 길이 알파벳의 열차와 12 번째 글자에 사용합니다.'i'의 터키 대문자 버전은 익숙하지 않은 캐릭터 'İ'입니다.

따라서 문자열 깡통과 주석은 영어로 같은 단어이지만, 터키에서 다른 단어입니다.내가 이해하는 것처럼, 한 사람은 '정신'을 의미하고 다른 하나는 오노 모아이아 단어입니다.(터키, 내가 틀렸다면, 나에게 바로 정정하거나 더 나은 예를 제시 해주십시오)

요약하면 '텍스트가 있는지 알지 못한다면'다른 경우에는 다른 경우에는 다음과 같은 두 개의 문자열이 동일한 질문에 대답 할 수 있습니다. 알지 못하면 펀트를 가져 가야합니다.소프트웨어에서 영어의 헤게모니를 감안할 때, 당신은 익숙하지 않은 방식으로 잘못 될 것이기 때문에 문화 info.invariantCulture에 의존해야합니다.



답변

다음과 같이 indexof ()를 사용할 수 있습니다.

string title = "STRING";

if (title.IndexOf("string", 0, StringComparison.CurrentCultureIgnoreCase) != -1)
{
    // The string exists in the original
}

0 (제로)이 인덱스가 될 수 있으므로 -1에 대해 확인하십시오.

마스크

해당 문자열이 발견되면 값의 0 기반 인덱스 위치 또는 -1 그렇지 않은 경우.값이 String.Empty 인 경우 반환 값은 0입니다.



답변

regex를 사용한 대체 솔루션 :

bool contains = Regex.IsMatch("StRiNG to search", Regex.Escape("string"), RegexOptions.IgnoreCase);


답변

.NET 코어 2.0+ (.NET 5.0+ 포함)

.NET Core에는 버전 2.0 이후이를 처리 할 수있는 한 쌍이 있습니다.

string.contains (char, stringcomparison) String.Contains (String, StringComparison)

예시:

"Test".Contains("test", System.StringComparison.CurrentCultureIgnoreCase);

이제는 공식적으로 .NET 표준 2.1의 일부 이므로이 버전의 표준 (또는 상위)을 구현하는 기본 클래스 라이브러리의 모든 구현의 일부입니다.



답변

언제든지 문자열을 먼저 위로 또는 내릴 수 있습니다.

string title = "string":
title.ToUpper().Contains("STRING")  // returns true

죄송합니다. 그냥 마지막 비트를 보았습니다.대소 문자를 구분하지 않는 비교가 * 아마도 어쨌든 동일하게 수행 할 수 있으며, 성능이 문제가 아닌 경우, 대문자 복사본을 만드는 데 문제가 있지 않습니다.나는 한 번 사례를 구분하지 않는 것을 한 번 봤다고 맹세 할 수있었습니다 ...

출처:https://stackoverflow.com/questions/444798/case-insensitive-containsstring