【C#】文字列から一部分を取り出す(Substringの使い方)

C# で文字列から一部分を取り出す処理は Substring メソッドを使用します。

この記事では、SubString の使い方と注意点、便利な使い方を紹介したいと思います。

確認環境

  • .NET 6
  • VisualStudio 2022
  • Windows 11

この記事は C# であればどのバージョンでも使用できます。

string.Substringメソッド

Substring には引数が異なる2種類のメソッドが存在します。

using System;

// 17文字の文字列
string str = "0123456789ABCDEFG";

// (1) 5文字目から最後まで取り出す
string parts1 = str.Substring(5);
Console.WriteLine(parts1);
// > 56789ABCDEFG

// (2) 3文字目から5文字分取り出す
string parts2 = str.Substring(3, 5);
Console.WriteLine(parts2);
// > 34567

指定する数字は配列のインデックスと同じく 0 から始まりのため指定した数字の後ろから切り取られます。

切り取り元の文字列は変化しません。

注意点

指定した数値が範囲外の場合、例外が発生します。そのため、Substring メソッドを呼び出す前に文字列の長さをチェックし、範囲を制限する必要があります。

// 17文字の文字列
string str = "0123456789ABCDEFG";

// ★(1)で18文字目を指定
string parts1 = str.Substring(18);
// 例外が発生する
// System.ArgumentOutOfRangeException:
// 'startIndex cannot be larger than length of string. Arg_ParamName_Name'

// ★(1)で17文字(最後の文字)目を指定
string parts1 = str.Substring(17);
Console.WriteLine(parts1);
// > (何も表示されない) ★17文字目から最後までは何も取得できない

// ----------

// ★(2)で18文字目を指定
string parts2 = str.Substring(18, 5);
// 例外が発生する
// System.ArgumentOutOfRangeException:
// 'startIndex cannot be larger than length of string. Arg_ParamName_Name'

// ★(2)で5文字目から範囲外の20文字切り出そうとする
string parts2 = str.Substring(5, 20);
// System.ArgumentOutOfRangeException:
// 'Index and length must refer to a location within the string. Arg_ParamName_Name'

このため事前に文字列の長さをチェックして切り取る範囲を制限する必要があります。

// 与える引数が範囲内かチェックする

int startIndex = 5;
int length = 10;

if (startIndex > str.Length)
{
    Console.WriteLine("startIndexが文字列より大きい");
}
else if (startIndex + length > str.Length)
{
    Console.WriteLine("lengthが文字列より大きい");
}
else
{
    string parts2 = str.Substring(startIndex, length);
}

例外を出したくない場合、このように事前に範囲内かチェックしてメソッドを呼び出すかどうか確認する必要があります。

安全に文字列を切り出す

ただ、文字列の長さは分からないけどどうしても切り出さないといけない時の方が多いので安全に取り出せるように処理を考えます。

public static class StringExtensions
{
    // 可能な限り文字を切り出す、無理な場合空文字を返す
    public static string SafeSubString(this string self, int startIndex, int length)
    {
        if (string.IsNullOrEmpty(self) || startIndex > self.Length)
        {
            return "";
        }

        int _len = length;
        if (startIndex + _len > self.Length)
        {
            return self.Substring(startIndex);
        }
        return self.Substring(startIndex, _len);
    }
}


// 範囲外でも例外を起こさず文字が取り出せる
string str = "0123456789ABCDEFG";
string parts = str.SafeSubString(12, 17);
Console.WriteLine(parts);
// > CDEFG