다음과 같은 결과를 얻을 수있는 방법이 있습니까?
string title = "ASTRINGTOTEST";
title.Contains("string");
케이스 감도를 설정할 수있는 과부하가없는 것 같습니다. 현재 두 가지 모두 대문자입니다. 그러나 그것은 바보입니다 (위로 및 아래로 케이스와 함께 제공 되는 i18n 문제를 참조합니다 ).
업데이트이
질문은 고대 적이며 그 이후로 완전히 조사하기를 원한다면 정말 광범위하고 어려운 주제에 대한 간단한 답변을 요구한다는 것을 깨달았습니다.
대부분의 경우, 단일 언어, 영어 코드 기반에서는 이 답변으로 충분합니다. 여기에 오는 대부분의 사람들이이 카테고리에 속하기 때문에 이것이 가장 인기있는 답변이라고 생각합니다.
이 대답은하지만 우리는 모두 텍스트가 같은 문화를 알고 때까지 우리는 텍스트의 경우를 구분 비교 할 수없는 고유의 문제를 제공하고 우리는 문화가 무엇인지 알고있다. 이것은 덜 인기있는 대답 일 수도 있지만 더 정확하다고 생각하므로 그렇게 표시했습니다.
답변
문자열에 문자열이 paragraph
포함되어 있는지 테스트하려면 word
(@QuarterMeister 덕분에)
culture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0
텍스트가 쓰여지는 언어를 설명 culture
하는 인스턴스는 어디에 있습니까 CultureInfo
?
이 솔루션은 언어에 따라 대소 문자를 구분하지 않는 정의에 대해 투명 합니다 . 예를 들어 영어 는 9 번째 문자 의 문자 I
와 i
대문자 및 소문자 버전을 사용하는 반면 터키어 는 29 자 길이의 알파벳 의 11 번째 및 12 번째 문자 에이 문자를 사용합니다 . ‘i’의 터키어 대문자 버전은 익숙하지 않은 문자 ‘İ’입니다.
따라서 문자열 tin
과 영어TIN
는 같은 단어 이지만 터키어는 다른 단어 입니다 . 내가 이해하는 것처럼, 하나는 ‘정신’을 의미하고 다른 하나는 의성어입니다. (터크, 내가 틀렸다면 정정하거나 더 좋은 예를 제안하십시오)
요약 하면 텍스트가 어떤 언어인지 아는 경우 ‘이 두 문자열은 동일하지만 다른 경우에 해당’이라는 질문에만 대답 할 수 있습니다 . 당신이 모른다면, 당신은 펀트를해야합니다. 소프트웨어에서 영어의 패권을 감안할 때 CultureInfo.InvariantCulture
친숙한 방식으로 잘못 될 수 있기 때문에 아마 의지해야 합니다.
답변
당신이 사용할 수있는 경우 String.indexOf 방법 및 합격 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 (2015 VS) 이후, 이전 버전 사용에 대한
if (source == null) return false;
return source.IndexOf(toCheck, comp) >= 0;
용법:
string title = "STRING";
bool contains = title.Contains("string", StringComparison.OrdinalIgnoreCase);
답변
다음 IndexOf()
과 같이 사용할 수 있습니다 :
string title = "STRING";
if (title.IndexOf("string", 0, StringComparison.CurrentCultureIgnoreCase) != -1)
{
// The string exists in the original
}
0은 인덱스가 될 수 있으므로 -1과 비교하여 확인합니다.
해당 문자열이 발견되면 0부터 시작하는 인덱스 위치 (값이 없으면 -1)입니다. value가 String.Empty이면 리턴 값은 0입니다.
답변
정규식을 사용하는 대체 솔루션 :
bool contains = Regex.IsMatch("StRiNG to search", Regex.Escape("string"), RegexOptions.IgnoreCase);
답변
항상 문자열을 먼저 대문자 또는 소문자로 지정할 수 있습니다.
string title = "string":
title.ToUpper().Contains("STRING") // returns true
죄송합니다. 마지막 부분을 보았습니다. 사례를 구분는 것이다 비교 *
아마도 *
같은 어쨌든을, 성능이 문제가되지 않을 경우, 나는 복사 대문자로 작성하고 그 비교에 문제가 표시되지 않습니다. 나는 한 번 대소 문자를 구분하지 않는 것을 한 번 봤다고 맹세 할 수 있었다 …
답변
.NET Core 2.0 이상 (현재)
.NET Core는 버전 2.0 이후에 이것을 처리하는 한 쌍의 메소드를 가지고 있습니다.
- String. 포함 (Char, StringComparison )
- String.Contains (String, StringComparison )을 포함합니다.
예:
"Test".Contains("test", System.StringComparison.CurrentCultureIgnoreCase);
시간이 지나면 아마도 .NET 표준으로, 그리고 거기에서 기본 클래스 라이브러리의 다른 모든 구현으로 갈 것입니다.
답변
대답의 한 가지 문제는 문자열이 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;
}