C에서 문자열 검색#

팁 (조언)

이 문서는 이미 하나 이상의 프로그래밍 언어를 알고 있으며 C#을 학습하는 개발자를 위한 기본 사항 섹션의 일부입니다. 프로그래밍을 처음 접하는 경우 먼저 시작 자습서로 시작 하세요.

다른 언어에서 오시겠습니까? C# string 메서드(예: Contains, StartsWith, IndexOf)는 Java의 String 및 JavaScript의 String.prototype에 있는 대응 메서드와 유사합니다. 주요 차이점은 일부 C# 검색이 기본적으로 서수(ordinal) 및 대/소문자 구분 비교를 사용한다는 것입니다. 나머지는 현재 문화권의 의미 체계를 기본적으로 따릅니다. 사용자 대상 검색의 경우 StringComparison 값을 전달하는 것이 좋습니다.

이 수업에는 String 다음과 같은 두 가지 일상적인 질문에 대답하는 메서드가 포함되어 있습니다.

정규식을 사용하여 더 복잡한 검색 및 대체 알고리즘을 빌드할 수 있습니다. 정규식 및 기타 문자열 작업에 대한 자세한 내용은 문자열 작업에 대한 언어 참조 문서를 참조하세요.

문자열에 텍스트가 포함되어 있는지 확인

부분 문자열의 존재 여부를 테스트하려면 Contains, StartsWith 또는 EndsWith를 사용합니다:

string factMessage = "Extension methods have all the capabilities of regular static methods.";

// Write the string and include the quotation marks.
Console.WriteLine($"\"{factMessage}\"");

// Default comparisons are case sensitive.
bool containsSearchResult = factMessage.Contains("extension");
Console.WriteLine($"""Contains "extension"? {containsSearchResult}""");

// For user-facing searches, pass a StringComparison value to control case and culture.
bool ignoreCaseSearchResult = factMessage.StartsWith("extension", StringComparison.CurrentCultureIgnoreCase);
Console.WriteLine($"""Starts with "extension"? {ignoreCaseSearchResult} (ignoring case)""");

bool endsWithSearchResult = factMessage.EndsWith(".", StringComparison.Ordinal);
Console.WriteLine($"Ends with '.'? {endsWithSearchResult}");
// => "Extension methods have all the capabilities of regular static methods."
// => Contains "extension"? False
// => Starts with "extension"? True (ignoring case)
// => Ends with '.'? True

이러한 메서드는 기본적으로 대/소문자를 구분하는 서수 비교를 사용합니다. 사용자 입력을 허용하거나 표시 텍스트의 대/소문자를 무시하려면 StringComparison.CurrentCultureIgnoreCase 또는 StringComparison.OrdinalIgnoreCase와 같은 StringComparison 값을 전달합니다.

단일 문자를 검색할 때는 Containschar 오버로드를 사용합니다. 한 문자 문자열을 할당하지 않고 더 직접적입니다.

string path = "/usr/local/bin";
bool hasSlash = path.Contains('/');
Console.WriteLine($"Path contains '/': {hasSlash}");
// => Path contains '/': True

텍스트 위치 찾기

IndexOf 는 첫 번째 부분 문자열(또는 문자)의 인덱스(0부터 시작)를 반환하고 LastIndexOf 마지막 항목의 인덱스도 반환합니다. 둘 다 검색 텍스트가 없을 경우 -1를 반환합니다. 두 표식 사이에 텍스트를 추출하도록 결합합니다.

string factMessage = "Extension methods have all the capabilities of regular static methods.";

Console.WriteLine($"\"{factMessage}\"");

// Extract the text between the first and last occurrence of "methods".
int first = factMessage.IndexOf("methods") + "methods".Length;
int last = factMessage.LastIndexOf("methods");
string between = factMessage.Substring(first, last - first);
Console.WriteLine($"""Substring between "methods" and "methods": '{between}'""");
// => "Extension methods have all the capabilities of regular static methods."
// => Substring between "methods" and "methods": ' have all the capabilities of regular static '

첫 번째나 마지막이 아니라 모든 발생 위치가 필요한 경우, 이전 결과에 1을 더한 값을 startIndex 인수로 전달하며 반복하거나 정규식으로 전환합니다.

올바른 비교 선택

대부분의 검색 오버로드는 선택적 StringComparison 값을 허용합니다. 검색하는 데이터의 종류에 따라 선택합니다.

  • 식별자, 파일 경로, 프로토콜 토큰 또는 컴퓨터에서 정의한 다른 항목을 검색하는 경우 다음을 사용합니다 Ordinal.
  • 동일한 종류의 컴퓨터 정의 데이터를 검색하지만 대/소문자를 구분하지 않으려면 다음을 사용합니다 OrdinalIgnoreCase.
  • 현재 로캘의 규칙이 적용되어야 하는 사용자 표시 텍스트를 검색하는 경우 다음을 사용합니다 CurrentCulture.
  • 같은 사용자 표시 텍스트를 검색하면서 대/소문자를 구분하지 않으려면 CurrentCultureIgnoreCase을(를) 사용하세요.
  • 모든 컴퓨터와 문화권에서 동일한 방식으로 비교되어야 하는 영구 저장된 데이터를 검색하는 경우에는 InvariantCulture를 사용합니다(거의 필요하지 않음).

서수 비교는 가장 빠른 옵션이며 자연어 텍스트가 아닌 모든 항목에 대한 올바른 기본값입니다. 문화권을 고려한 비교는 상당히 느리며 예상치 못한 결과를 초래할 수 있습니다. 예를 들어 일부 문화권에서는 소문자 i가 대문자 I와 일치하지 않습니다. 이는 사용자가 일반 텍스트를 대상으로 수행하는 검색에만 사용하십시오.

문화권을 고려한 비교에 대한 자세한 설명은 문자열 비교 모범 사례를 참조하세요.

참고하십시오