질문자 :Boris Callens
다음 반환을 true로 만드는 방법이 있습니까?
string title = "ASTRINGTOTEST"; title.Contains("string");
대소문자 구분을 설정할 수 있는 과부하가 없는 것 같습니다. 현재 저는 둘 다 대문자로 표기하고 있지만 그것은 어리석은 일입니다(위/아래 대소문자와 함께 제공 되는 i18n 문제를 언급하는 것입니다).
업데이트
이 질문은 아주 오래된 질문이며, 그 이후로 저는 여러분이 충분히 조사하고 싶다면 정말 방대하고 어려운 주제에 대해 간단한 답변을 요청했다는 것을 깨달았습니다.
대부분의 경우 단일 언어의 영어 코드 기반에서는 이 답변으로 충분합니다. 여기에 오는 대부분의 사람들이 이 범주에 속하기 때문에 이것이 가장 인기 있는 답변이라고 생각합니다.
그러나 이 답변은 두 텍스트가 동일한 문화권이고 해당 문화권이 무엇인지 알 때까지 대소문자를 구분하지 않는 텍스트를 비교할 수 없다는 고유한 문제를 제기합니다. 이것은 덜 인기있는 답변 일 수 있지만 더 정확하다고 생각하고 그렇게 표시했습니다.
String.IndexOf
메서드 를 사용하고 사용할 검색 유형으로 StringComparison.OrdinalIgnoreCase
를 전달할 수 있습니다.
string title = "STRING"; bool contains = title.IndexOf("string", StringComparison.OrdinalIgnoreCase) >= 0;
더 나은 것은 string에 대한 새로운 확장 방법을 정의하는 것입니다.
public static class StringExtensions { public static bool Contains(this string source, string toCheck, StringComparison comp) { return source?.IndexOf(toCheck, comp) >= 0; } }
참고로 null 전파 ?.
이전 버전의 경우 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);
JaredParparagraph
word
가 포함되어 있는지 테스트하려면 (@QuarterMeister에게 감사드립니다)
culture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0
여기서 culture
는 텍스트가 작성된 언어를 설명하는 CultureInfo
의 인스턴스입니다.
이 솔루션은 언어에 따라 달라지는 대소문자 구분의 정의에 대해 투명합니다. 예를 들어, 영어는 9번째 문자의 대문자 및 소문자 버전에 I
및 i
문자를 사용하는 반면 터키어는 29자 길이의 알파벳 중 11번째 및 12번째 문자에 이러한 문자를 사용합니다. 'i'의 터키어 대문자 버전은 생소한 문자 'İ'입니다.
따라서 문자열 tin
과 TIN
은 영어 에서는 같은 단어 이지만 터키어 에서는 다른 단어입니다. 제가 알기로는 하나는 '영'을 의미하고 다른 하나는 의성어입니다. (터키인, 내가 틀렸다면 정정하거나 더 나은 예를 제안하십시오)
요약하자면, 텍스트가 어떤 언어로 되어 있는지 알고 있는 경우에만 '이 두 문자열은 동일하지만 경우가 다릅니다'라는 질문에 답할 수 있습니다. 모르면 덤벼야 합니다. 소프트웨어에서 영어의 패권을 감안할 때 CultureInfo.InvariantCulture
의존해야 합니다. 친숙한 방식으로 틀리기 때문입니다.
Colonel Panic다음과 같이 IndexOf()
사용할 수 있습니다.
string title = "STRING"; if (title.IndexOf("string", 0, StringComparison.CurrentCultureIgnoreCase) != -1) { // The string exists in the original }
0(영)은 인덱스가 될 수 있으므로 -1에 대해 확인합니다.
MSDN
해당 문자열이 있는 경우 값의 0부터 시작하는 인덱스 위치, 그렇지 않은 경우 -1입니다. 값이 String.Empty이면 반환 값은 0입니다.
mkchandler정규식을 사용하는 대체 솔루션:
bool contains = Regex.IsMatch("StRiNG to search", Regex.Escape("string"), RegexOptions.IgnoreCase);
Jed.NET Core 2.0 이상(.NET 5.0 이상 포함)
.NET Core에는 버전 2.0부터 이를 처리하는 한 쌍의 메서드가 있습니다.
- String.Contains(Char, StringComparison )
- String.Contains (문자열, StringComparison)
예시:
"Test".Contains("test", System.StringComparison.CurrentCultureIgnoreCase);
이제 공식적으로 .NET Standard 2.1의 일부가 되었으며, 따라서 이 버전의 표준(또는 더 높은 버전)을 구현하는 기본 클래스 라이브러리의 모든 구현에 포함됩니다.
Mathieu Renda항상 문자열을 먼저 올리거나 내릴 수 있습니다.
string title = "string": title.ToUpper().Contains("STRING") // returns true
앗, 방금 마지막 비트를 보았습니다. 대소문자를 구분하지 않는 비교는 *
아마도 *
어쨌든 동일한 작업을 수행할 것이며, 성능이 문제가 되지 않는다면 대문자 사본을 만들고 비교하는 데 문제가 없다고 봅니다. 대소문자를 구분하지 않는 비교를 한 번 본 적이 있다고 맹세할 수 있었는데...
Ed S.대답의 한 가지 문제는 문자열이 null인 경우 예외가 발생한다는 것입니다. 다음을 수행하지 않도록 수표로 추가할 수 있습니다.
public static bool Contains(this string source, string toCheck, StringComparison comp) { if (string.IsNullOrEmpty(toCheck) || string.IsNullOrEmpty(source)) return true; return source.IndexOf(toCheck, comp) >= 0; }
FeiBao 飞豹StringExtension 클래스는 앞으로 나아갈 길입니다. 위의 몇 가지 게시물을 결합하여 완전한 코드 예제를 제공했습니다.
public static class StringExtensions { /// <summary> /// Allows case insensitive checks /// </summary> public static bool Contains(this string source, string toCheck, StringComparison comp) { return source.IndexOf(toCheck, comp) >= 0; } }
AndrewtakiralaFabian BiglerLAV VISHWAKARMAPradeep AsankacdytobyserhioCaseymr.martandashraderTarmoPikaroStendChristian Findlayshaishav shuklaUdi YTamilselvan KOkan SARICAMr.BFinal HeavenValentin PetaO Thạnh Ldt출처 : http:www.stackoverflow.com/questions/444798/case-insensitive-containsstring