대소문자를 구분하지 않는 'Contains(string)'
다음과 같은 리턴을 실현하는 방법이 있습니까?
string title = "ASTRINGTOTEST";
title.Contains("string");
대소문자를 구분할 수 있는 오버로드가 없는 것 같습니다.현재는 둘 다 대문자로 표기하고 있습니다만, 이것은 매우 어리석은 것입니다(이것에 의해, 「i18n」의 문제를 나타내고 있습니다).
갱신하다
이 질문은 아주 오래된 것이고, 그 이후로 나는 당신이 그것을 충분히 조사하기를 원한다면 정말 광범위하고 어려운 주제에 대해 간단한 답을 요구했다는 것을 깨달았다.
대부분의 경우, 단일 언어에서 영어 코드 베이스는 이 답변으로 충분합니다.여기 오는 대부분의 사람들이 이 범주에 속하기 때문에 이것이 가장 인기 있는 답이라고 생각합니다.
그러나 이 답변은 두 텍스트가 같은 문화이고 그 문화가 무엇인지 알기 전에는 대소문자를 구분하지 않는다는 본질적인 문제를 제기한다.이것은 별로 인기가 없는 대답일 수도 있지만, 저는 그것이 더 옳다고 생각하기 때문에 그렇게 표시한 것입니다.
Method and pass를 사용할 검색 유형으로 사용할 수 있습니다.
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;
}
}
주의: 이 늘 전파는 ?.는 C6. 2015)부터 사용할 수 구 버전에서는 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);
이 "" " " " " " " 가 합니다.paragraph에는 문자열이 되어 있습니다.word@QuarterMeister (QuarterMeister @QuarterMeister)
culture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0
서 ★★★★★culture는 텍스트가 기술된 언어를 설명하는 인스턴스입니다.
이 솔루션은 대소문자를 구분하지 않는 언어의 정의에 대해 투명합니다.예를 들어, 영어에서는 다음과 같은 문자를 사용합니다.I ★★★★★★★★★★★★★★★★★」i터키어는 29자 길이의 알파벳 중 11번째와 12번째 글자에 이 문자를 사용하는 반면, 대소문자는 9번째 글자의 대소문자를 사용한다.터키어 대문자 'i'는 낯선 문자 'Ii'이다.
tin ★★★★★★★★★★★★★★★★★」TIN영어에서는 같은 단어지만 터키어에서는 다른 단어입니다.제가 알기로는 하나는 '정신'을 뜻하고 다른 하나는 의성어입니다.(터크, 틀렸으면 정정해주시거나 더 좋은 예를 제시해주세요.)
요약하자면, 텍스트가 어떤 언어로 되어 있는지 알고 있어야만 '이 두 문자열은 같지만 경우에 따라 다른가?'라는 질문에 대답할 수 있습니다.모르면 펀트를 맞아야 할 거야.소프트웨어에 있어서의 영어의 패권을 고려하면, 익숙한 방식으로는 틀릴 것이기 때문에, 당신은 아마 에 의지해야 할 것이다.
하시면 됩니다.IndexOf()음음음같 뭇매하다
string title = "STRING";
if (title.IndexOf("string", 0, StringComparison.OrdinalIgnoreCase) != -1)
{
// The string exists in the original
}
0(제로)은 인덱스가 될 수 있으므로 -1에 대해 확인합니다.
문자열이 발견되면 현재 인스턴스의 시작부터 값 파라미터의 제로 베이스 인덱스 위치, 발견되지 않으면 -1.값이 Empty이면 반환 값은 start입니다.색인.
.NET Core 2.0+ (포함)NET 5.0+)
.NET Core에서는 버전 2.0 이후 이 문제를 해결하기 위한 두 가지 방법이 있습니다.
- String. 포함(Char, String Comparison)
- String. 포함(String, String Comparison)
예:
"Test".Contains("test", System.StringComparison.CurrentCultureIgnoreCase);
이제 공식적으로 의 일부가 되었습니다.NET Standard 2.1. 따라서 이 버전의 표준(또는 더 높은 버전)을 구현하는 기본 클래스 라이브러리의 모든 구현의 일부입니다.
Regex를 사용한 대체 솔루션:
bool contains = Regex.IsMatch("StRiNG to search", Regex.Escape("string"), RegexOptions.IgnoreCase);
항상 먼저 줄을 올리거나 내릴 수 있습니다.
string title = "string":
title.ToUpper().Contains("STRING") // returns true
아, 아, 아, 아, 아, 아, 아, 아, 아.하지 않는 는 「」입니다.* 그럴 것이다*성능이 문제가 되지 않는다면 대문자 복사본을 만들고 비교하는 데 문제가 없다고 생각합니다.한 번은 대소문자를 구분하지 않는 비교를 본 적이 있다고 맹세할 수 있었는데...
답변의 한 가지 문제는 문자열이 늘일 경우 예외가 발생한다는 것입니다.다음 작업을 수행하지 않도록 수표로 추가할 수 있습니다.
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;
}
String Extension 클래스는 앞으로 나아가기 위한 방법이며, 저는 완전한 코드 예를 제시하기 위해 위의 몇 가지 게시물을 조합했습니다.
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;
}
}
OrdinalIgnoreCase, CurrentCultureIgnoreCase 또는 UnfusentCultureIgnoreCase?
이 기능이 없기 때문에 다음 중 하나를 사용해야 할 시기에 대한 권장 사항을 몇 가지 소개합니다.
작업
StringComparison.OrdinalIgnoreCase비교는 문화에 구애받지 않는 문자열 매칭을 위한 안전한 기본값입니다.StringComparison.OrdinalIgnoreCase속도를 비교합니다.StringComparison.CurrentCulture-based사용자에게 출력을 표시할 때 문자열 조작을 수행합니다.- 의 현재의 해, 사용법을 합니다.
StringComparison.Ordinal★★★★★★★★★★★★★★★★★」StringComparison.OrdinalIgnoreCase가 되면
이치노 ToUpperInvariantToLowerInvariant비교를 위해 문자열을 정규화할 때 사용합니다.
하지 않다
- 문자열 비교 메커니즘을 명시적으로 또는 암묵적으로 지정하지 않는 문자열 작업에 오버로드를 사용합니다.
StringComparison.InvariantCulture(베이스 스트링)
동작: 몇 중 는 " " " 입니다. " 입니다.
언어적으로는 의미가 있지만 문화에 구애받지 않는 데이터가 지속되고 있습니다.
다음 규칙에 따라 사용해야 합니다.
string title = "STRING";
if (title.IndexOf("string", 0, StringComparison.[YourDecision]) != -1)
{
// The string exists in the original
}
반면 [Your Decision]는 상기의 권장 사항에 따라 달라집니다.
소스 링크: http://msdn.microsoft.com/en-us/library/ms973919.aspx
츠미야
Regex.IsMatch(file, fileNamestr, RegexOptions.IgnoreCase)
이것이 가장 쉬운 해결책입니다.
색인별
string title = "STRING"; if (title.IndexOf("string", 0, StringComparison.CurrentCultureIgnoreCase) != -1) { // contains }대소문자를 변경하다
string title = "STRING"; bool contains = title.ToLower().Contains("string")정규식별
Regex.IsMatch(title, "string", RegexOptions.IgnoreCase);
심플하고 기능하다
title.ToLower().Contains("String".ToLower())
바로 다음과 같습니다.
string s="AbcdEf";
if(s.ToLower().Contains("def"))
{
Console.WriteLine("yes");
}
이것은 C#이 아니라 프레임워크(VB)에 있는 것을 알고 있습니다.NET) 이미 이러한 기능이 있습니다.
Dim str As String = "UPPERlower"
Dim b As Boolean = InStr(str, "UpperLower")
C# 바리안트:
string myString = "Hello World";
bool contains = Microsoft.VisualBasic.Strings.InStr(myString, "world");
문자열 비교 파라미터(에서 사용 가능)를 사용할 수 있습니다.NET Core 2.1 이상) 문자열.메서드가 포함되어 있습니다.
public bool Contains (string value, StringComparison comparisonType);
예:
string title = "ASTRINGTOTEST";
title.Contains("string", StringComparison.InvariantCultureIgnoreCase);
InStr국제화에 관심이 있는 경우(또는 재실장할 수 있는 경우)에는 VisualBasic 어셈블리의 메서드를 사용하는 것이 좋습니다.dotNeetPeek는 대소문자뿐만 아니라 가나형 및 전각문자 대 반각문자(대부분은 아시아 언어와 관련이 있지만 로마자 전체 폭 버전도 있음)도 고려되고 있음을 보여줍니다. 메서드인 「 방법」을 확인해 주세요.InternalInStrText:
private static int InternalInStrText(int lStartPos, string sSrc, string sFind)
{
int num = sSrc == null ? 0 : sSrc.Length;
if (lStartPos > num || num == 0)
return -1;
if (sFind == null || sFind.Length == 0)
return lStartPos;
else
return Utils.GetCultureInfo().CompareInfo.IndexOf(sSrc, sFind, lStartPos, CompareOptions.IgnoreCase | CompareOptions.IgnoreKanaType | CompareOptions.IgnoreWidth);
}
사용방법:
string.Compare("string", "STRING", new System.Globalization.CultureInfo("en-US"), System.Globalization.CompareOptions.IgnoreCase);
이것은 여기의 다른 예시와 매우 비슷하지만, 일반적으로 다른 대안이 필요하지 않기 때문에 열거형을 bool로 단순화하기로 결정했습니다.다음은 예를 제시하겠습니다.
public static class StringExtensions
{
public static bool Contains(this string source, string toCheck, bool bCaseInsensitive )
{
return source.IndexOf(toCheck, bCaseInsensitive ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal) >= 0;
}
}
용도는 다음과 같습니다.
if( "main String substring".Contains("SUBSTRING", true) )
....
RegEx를 사용하는 것은 이를 위한 간단한 방법입니다.
Regex.IsMatch(title, "string", RegexOptions.IgnoreCase);
여기에 있는 답변을 바탕으로 문자열 확장 메서드를 생성하여 보다 사용하기 쉽게 만들 수 있습니다.
public static bool ContainsIgnoreCase(this string paragraph, string word)
{
return CultureInfo.CurrentCulture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0;
}
전달된 문자열이 문자열에 있는지 확인하려면 간단한 방법이 있습니다.
string yourStringForCheck= "abc";
string stringInWhichWeCheck= "Test abc abc";
bool isContained = stringInWhichWeCheck.ToLower().IndexOf(yourStringForCheck.ToLower()) > -1;
문자열이 포함되거나 포함되지 않은 경우 이 부울 값이 반환됩니다.
이전 답변(확장 방식 사용)과 비슷하지만 2개의 간단한 늘체크(C# 6.0 이후):
public static bool ContainsIgnoreCase(this string source, string substring)
{
return source?.IndexOf(substring ?? "", StringComparison.OrdinalIgnoreCase) >= 0;
}
소스가 null인 경우 false를 반환합니다(null 전파 연산자 ?).
하위 문자열이 null인 경우 빈 문자열로 처리하여 true를 반환합니다(null-coalescing 연산자를 통해?).
물론 StringComparison은 필요에 따라 파라미터로 송신할 수 있습니다.
상위 등급의 몇 가지 답변은 모두 나름대로 훌륭하고 정확하며, 더 많은 정보, 컨텍스트 및 관점을 추가하기 위해 여기에 글을 씁니다.
알기 쉽게 하기 위해 A에 코드 포인트(B와 동일한 것)의 후속이 있는 경우 문자열A에 문자열B가 포함되어 있다고 합니다.이를 받아들이면 문제는 두 문자열이 동일한지 여부에 대한 질문으로 축소됩니다.
현이 언제 같는지에 대한 문제는 수십 년 동안 자세히 고려되어 왔다.현재 지식의 대부분은 SQL 대조로 요약되어 있습니다.Unicode 정규 형식은 이것의 적절한 부분 집합에 가깝습니다.그러나 SQL 대조보다 더 많은 것이 있습니다.
예를 들어 SQL 대조에서는 다음과 같이 할 수 있습니다.
엄밀하게 2진수 민감 - 서로 다른 Unicode 정규화 형식(예: 사전 조합 또는 조합된 액센트)이 서로 다르게 비교되도록 합니다.
를 들어, 「」라고 하는 것은,
é라고 될 수 있다U+00e9조합) 또는 ( 조합)U+0065 U+0301(e, 「e」, 「e」).이것들은 같은 건가요 아니면 다른 건가요?
Unicode 정규화 - 이 경우 위의 예는 서로 동일하지만,
É★★★★★★★★★★★★★★★★★」e.(스페인어, 독일어, 스웨덴어 텍스트 등) 악센트에 민감하지 않습니다.이 경우
U+0065=U+0065 U+0301=U+00e9=é=e대소문자를 구분하지 않기 때문에 (스페인어, 독일어, 스웨덴어 텍스트 등)이 경우
U+00e9=U+0065 U+0301=U+00c9=U+0045 U+0301=U+0049=U+0065=E=e=É=éKanatype은 민감하거나 둔감합니다. 즉, 일본어의 Hiragana와 Katakana는 동등하거나 다르다고 볼 수 있습니다.두 개의 음절 문자에는 동일한 수의 문자가 포함되어 있으며 (대부분은) 같은 방식으로 구성되고 발음되지만 다르게 쓰여지고 다른 목적으로 사용됩니다.예를 들어 가타카나는 외래어나 외래어 등에 쓰이지만, 히라가나는 아동 도서나 발음 가이드(루비 등), 한자가 없는 경우(혹은 글쓴이가 한자를 모르거나 독자가 모를 수 있다고 생각되는 경우)에 쓰인다.
전폭 또는 반폭 민감 - 일본 부호화에는 역사적 이유로 일부 문자를 두 개 표현한 것이 포함되어 있으며 크기가 서로 다릅니다.
동등 또는 동등하지 않은 것으로 간주되는 연결:https://en.wikipedia.org/wiki/Ligature_(writing) 를 참조해 주세요.
이는?
æ와와 the와ae유니코드 악센트 보입니다악센트 문자와 마찬가지로 유니코드 인코딩도 다르지만 악센트 문자와는 다르게 보입니다.그래서 우리는...
아랍어 프레젠테이션 형식의 동등성
아랍 문자는 인접한 글자의 특정한 배열이 특정한 표현을 갖는 아름다운 서예 문화를 가지고 있다.이들 중 대부분은 유니코드 표준으로 인코딩되어 있습니다.규칙을 완전히 이해하지는 못하지만, 제가 보기엔 연결고리와 비슷한 것 같아요.
기타 스크립트 및 시스템:칸나다, 말라얄람, 신할라, 태국어, 구자라티, 티베트어, 또는 언급되지 않은 거의 모든 대본에 대해 전혀 알지 못합니다.프로그래머에게도 비슷한 문제가 있다고 생각합니다.또, 지금까지의 몇개의 문제나, 몇개의 스크립트에 대해서도, 프로그래머가 고려해야 할 다른 문제도 있을 것입니다.
그것은 우리를 "암호화" 잡초에서 벗어나게 해준다.
이제 우리는 "의미"의 잡초 속으로 들어가야 한다.
Beijing에 equal北京않으면 ??Bĕijīng에 equal北京약아아니,,,,??그것은 핀인의 로마자 표기법이다.이는?
Peking에 equal北京약아아니,,,,??이치노이는?
Beijing에 equalPeking약아아니,,,,??
근데 왜 이러는 거야?
예를 들어, 2개의 문자열(A와 B)이 같은 지리적 위치 또는 동일한 인물을 참조할 수 있는지 여부를 확인하려면 다음과 같이 질문할 수 있습니다.
이 문자열은 Wade-Giles 또는 Pinyin의 한자 시퀀스를 나타낼 수 있습니까?그렇다면 대응하는 세트 사이에 오버랩이 있습니까?
이 문자열 중 하나가 한자의 키릴 문자일 수 있나요?
이 문자열 중 하나가 핀어 로마자 표기법의 키릴어 번역일 수 있나요?
이 문자열 중 하나가 영어 이름의 시나이션을 병음한 키릴어 번역일 수 있습니까?
확실히 이것은 어려운 질문이고, 확실한 답은 없으며, 어떤 경우에도 질문의 목적에 따라 정답이 다를 수 있습니다.
구체적인 예를 들어 마무리하다.
- 소포를 는, 전달해 .
Beijing,Peking,Bĕijīng★★★★★★★★★★★★★★★★★」北京모두 평등합니다.그목목,,,,,,,,,좋,좋좋좋좋좋좋. 없이 중국 은 다른 옵션들을 하고 있습니다. , 중국 우체국에서는 다른 많은 옵션들을 인식합니다.Pékin프랑스어로.Pequim갈갈 in in in in inBắc Kinh★★★★★★★★★★★★★★★★★★★★★★★★★★.Бээжин몽골어로.
단어에는 일정한 의미가 없습니다.
단어는 우리가 세계를 항해하고, 우리의 임무를 수행하고, 다른 사람들과 소통하기 위해 사용하는 도구입니다.
말이 이 될 것 equality,Beijing , 「」meaning고정된 의미를 가지고 있다, 슬픈 사실은 그렇지 않다는 것이다.
하지만 우리는 어떻게든 그럭저럭 살아가고 있는 것 같다.
TL;DR: 모든 성운(흐림, 불확실성, 명확한 경계 결여)에서 현실과 관련된 질문을 다루고 있다면 기본적으로 모든 질문에 대해 세 가지 가능한 답이 있습니다.
- 아마
- 아마 아닐 것입니다.
- 아마도요.
if ("strcmpstring1".IndexOf(Convert.ToString("strcmpstring2"), StringComparison.CurrentCultureIgnoreCase) >= 0){return true;}else{return false;}
하시면 됩니다.string.indexof ()를 구분하지 않습니다.
여기서 요령은 대소문자를 무시하고 문자열을 찾는 것입니다. 그러나 대소문자는 동일하게 유지합니다.
var s="Factory Reset";
var txt="reset";
int first = s.IndexOf(txt, StringComparison.InvariantCultureIgnoreCase) + txt.Length;
var subString = s.Substring(first - txt.Length, txt.Length);
출력은 "Reset"입니다.
public static class StringExtension
{
#region Public Methods
public static bool ExContains(this string fullText, string value)
{
return ExIndexOf(fullText, value) > -1;
}
public static bool ExEquals(this string text, string textToCompare)
{
return text.Equals(textToCompare, StringComparison.OrdinalIgnoreCase);
}
public static bool ExHasAllEquals(this string text, params string[] textArgs)
{
for (int index = 0; index < textArgs.Length; index++)
if (ExEquals(text, textArgs[index]) == false) return false;
return true;
}
public static bool ExHasEquals(this string text, params string[] textArgs)
{
for (int index = 0; index < textArgs.Length; index++)
if (ExEquals(text, textArgs[index])) return true;
return false;
}
public static bool ExHasNoEquals(this string text, params string[] textArgs)
{
return ExHasEquals(text, textArgs) == false;
}
public static bool ExHasNotAllEquals(this string text, params string[] textArgs)
{
for (int index = 0; index < textArgs.Length; index++)
if (ExEquals(text, textArgs[index])) return false;
return true;
}
/// <summary>
/// Reports the zero-based index of the first occurrence of the specified string
/// in the current System.String object using StringComparison.InvariantCultureIgnoreCase.
/// A parameter specifies the type of search to use for the specified string.
/// </summary>
/// <param name="fullText">
/// The string to search inside.
/// </param>
/// <param name="value">
/// The string to seek.
/// </param>
/// <returns>
/// The index position of the value parameter if that string is found, or -1 if it
/// is not. If value is System.String.Empty, the return value is 0.
/// </returns>
/// <exception cref="ArgumentNullException">
/// fullText or value is null.
/// </exception>
public static int ExIndexOf(this string fullText, string value)
{
return fullText.IndexOf(value, StringComparison.OrdinalIgnoreCase);
}
public static bool ExNotEquals(this string text, string textToCompare)
{
return ExEquals(text, textToCompare) == false;
}
#endregion Public Methods
}
기존 답변과 Contains 메서드의 문서화를 바탕으로 코너 케이스도 처리하는 다음 확장을 작성할 것을 권장합니다.
public static class VStringExtensions
{
public static bool Contains(this string source, string toCheck, StringComparison comp)
{
if (toCheck == null)
{
throw new ArgumentNullException(nameof(toCheck));
}
if (source.Equals(string.Empty))
{
return false;
}
if (toCheck.Equals(string.Empty))
{
return true;
}
return source.IndexOf(toCheck, comp) >= 0;
}
}
초보자를 위한 간단한 방법:
title.ToLower().Contains("string");//of course "string" is lowercase.
언급URL : https://stackoverflow.com/questions/444798/case-insensitive-containsstring
'programing' 카테고리의 다른 글
| 빈 디렉터리 찾기 (0) | 2023.04.15 |
|---|---|
| Android-Facebook 앱의 주요 해시 (0) | 2023.04.15 |
| 회선 끝 설정 변경 방법 (0) | 2023.04.15 |
| 다른 응용 프로그램에서 열려 있는 파일을 열려면 어떻게 해야 합니까? (0) | 2023.04.15 |
| 행 1부터 시작하는 열 F의 첫 번째 빈 셀을 선택합니다(오프셋 사용 안 함). (0) | 2023.04.15 |