본문 바로가기

.NET/C#

[C#] 문자열 05 - IndexOf() 문자열 찾기

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");
    }
}

 

확장 메서드에 대해서는 아래 글을 참고해주세요.

 

[C#] 확장 메서드를 사용해 메서드 호출을 간결하게 하기

C#에는 확장 메서드 기능이 있다. 어떤 타입에 대해 클래스 외부에서 해당 클래스의 멤버 메서드를 추가로 구현하는 것이라고 보면 이해하기 쉽다. (엄밀히 따지면 멤버 메서드는 아니다. private

cs-solution.tistory.com