String 클래스의 IndexOf() 메서드로 문자열 내에서 특정 문자 또는 부분 문자열이 시작되는 위치를 찾을 수 있다.
string.IndexOf(string) - 문자열 내에서 지정된 문자열이 처음 등장하기 시작하는 인덱스를 반환한다. 문자열이 등장하지 않을 경우 -1을 반환한다.
자매품으로 string.IndexOf(char)도 가능하다.
// 14 출력
Console.WriteLine("When you have faults, do not fear to abandon them.".IndexOf("faults").ToString());
// -1 출력
string str = "Age is no guarantee of maturity.";
Console.WriteLine(str.IndexOf("the").ToString());
string.LastIndexOf(string) - 문자열 내에서 지정된 문자열이 마지막으로 등장하기 시작하는 인덱스를 반환한다. 문자열이 등장하지 않을 경우 -1을 반환한다.
// 11 출력
Console.WriteLine("This is an apple and that is a pineapple.".IndexOf("apple").ToString());
// ^
// 35 출력
Console.WriteLine("This is an apple and that is a pineapple.".LastIndexOf("apple").ToString());
// ^
string.IndexOf(string, int) - 문자열 내에서 지정된 문자열이 처음 등장하기 시작하는 인덱스를 반환한다. 단, 지정된 시작 인덱스부터 검색한다.
string str = "You will face many defeats in life, but never let yourself be defeated.";
// -1 출력 (인덱스 13 이후로는 "will"이 등장하지 않음)
Console.WriteLine(str.IndexOf("will", 13).ToString());
string str2 = "Maya Angelou";
// 예외 발생 - startIndex로 지정된 값이 문자열의 길이보다 크다.
Console.WriteLine(str2.IndexOf("Maya", 31).ToString());
문자열에서 특정 문자열이 등장하는 위치를 모두 찾아 반환하는 메서드를 만들어보자.
public static class MyUtil
{
/// <summary>
/// 문자열에서 지정된 부분 문자열이 등장하는 모든 시작 위치를 반환합니다.
/// </summary>
/// <param name="src">원본 문자열입니다.</param>
/// <param name="value">검색할 문자열입니다.</param>
/// <returns>검색된 문자열들의 시작 위치를 담은 배열입니다. 문자열이 검색되지 않은 경우 빈 배열입니다.</returns>
/// <exception cref="ArgumentNullException">원본 문자열 또는 검색할 문자열이 null이었습니다.</exception>
/// <exception cref="ArgumentException">검색할 문자열의 길이가 0이었습니다.</exception>
public static int[] FindAll( this string src, string value )
{
// 예외처리
if ( src == null || value == null ) throw new ArgumentNullException( "원본 문자열과 찾으려는 문자열은 null일 수 없습니다." );
if ( value.Length == 0 ) throw new ArgumentException( "찾으려는 문자열의 길이가 0일 수 없습니다." );
var result = new List<int>();
var pos = 0;
while ( pos < src.Length )
{
var idx = src.IndexOf( value, pos );
if ( idx != -1 )
{
result.Add( idx );
pos += idx + value.Length;
}
else pos++;
}
return result.ToArray();
}
}
public static class Program
{
static void Main(string[] arg)
{
string str = "This is an apple and that is a pineapple.";
// 확장 메서드로 구현했기 때문에 string 타입에 대해서 바로 호출할 수 있다.
var res = str.FindAll("apple");
}
}
확장 메서드에 대해서는 아래 글을 참고해주세요.
'.NET > C#' 카테고리의 다른 글
[C#] Thread가 백그라운드에서 살아있을 때 (0) | 2022.11.14 |
---|---|
[C#] 문자열 04 - IsNullOrEmpty(), IsNullOrWhiteSpace() 문자열 판별하기 (0) | 2022.11.13 |
[C#] 문자열 03 - Trim(), TrimStart(), TrimEnd() (0) | 2022.07.05 |
[C#] 문자열 02 - Substring()으로 부분 문자열 가져오기 (0) | 2021.10.17 |
[C#] 문자열 01 - Split()으로 문자열 분할하기 (0) | 2021.10.17 |