文字列の部分抽出(Substring)
C#で文字列データを扱う際、長い文字列(例: ログデータ、URL、CSVの1行)から、必要な一部分だけを切り出して(抽出して)使用したいケースは非常に多くあります。
例えば、"UserID=1001"という文字列から"1001"の部分だけを取り出したり、"2025/11/12"という日付から"11"(月)の部分だけを取り出したりする場合です。
このような操作を簡単に行うために、stringクラスにはSubstringメソッドが用意されています。
Substring の基本的な使い方
Substringメソッドには、主に2つのオーバーロード(引数の形式)があります。どちらの形式でも、インデックス(位置)は0から数え始めることに注意してください。
1. Substring(int startIndex)
この形式は、指定した startIndex(開始位置)から文字列の最後までをすべて切り出します。
コード例1: プレフィックスの除去
ログメッセージからプレフィックス(例: "ERROR: ")を除去し、メッセージ本体だけを取得する例です。
using System;
public class SubstringFromStartExample
{
public static void Main()
{
string logMessage = "ERROR: File not found.";
// "ERROR: " は 7 文字
// インデックス 7 (8文字目) から最後までを切り出す
int startIndex = 7;
string mainMessage = logMessage.Substring(startIndex);
Console.WriteLine($"元の文字列: {logMessage}");
Console.WriteLine($"抽出後: {mainMessage}");
}
}
出力結果:
元の文字列: ERROR: File not found.
抽出後: File not found.
2. Substring(int startIndex, int length)
この形式は、指定した startIndex(開始位置)から、指定した length(文字数)分だけを切り出します。
コード例2: 特定の長さの部分抽出
ファイル名 "DATA_20251112_001.csv" から、日付部分("20251112")だけを8文字分切り出す例です。
using System;
public class SubstringWithLengthExample
{
public static void Main()
{
string fileName = "DATA_20251112_001.csv";
// "DATA_" (5文字) の次、インデックス 5 から
int startIndex = 5;
// 日付部分の文字数 8
int length = 8;
string datePart = fileName.Substring(startIndex, length);
Console.WriteLine($"元のファイル名: {fileName}");
Console.WriteLine($"抽出した日付: {datePart}");
}
}
出力結果:
元のファイル名: DATA_20251112_001.csv
抽出した日付: 20251112
応用: IndexOf と Substring の組み合わせ
Substringの開始位置を固定値(5や7)で指定する代わりに、IndexOfメソッド(キーワードの位置を検索)と組み合わせることで、より動的な文字列の分割が可能になります。
コード例3: 区切り文字による分割
"Key=Value" という形式の文字列から、=(イコール)を区切り文字としてKeyとValueを分離する例です。
using System;
public class SubstringWithIndexOfExample
{
public static void Main()
{
string setting = "ConfigKey=ServerHost123";
// 1. 区切り文字 '=' の位置を検索
int delimiterIndex = setting.IndexOf('='); // 9 が返る
if (delimiterIndex != -1) // -1 は「見つからなかった」の意味
{
// 2. Key を抽出 (インデックス 0 から 9 文字分)
string key = setting.Substring(0, delimiterIndex);
// 3. Value を抽出 (インデックス 9 の次の文字 (10) から最後まで)
string value = setting.Substring(delimiterIndex + 1);
Console.WriteLine($"元の文字列: {setting}");
Console.WriteLine($"Key: {key}");
Console.WriteLine($"Value: {value}");
}
else
{
Console.WriteLine("区切り文字 '=' が見つかりませんでした。");
}
}
}
出力結果:
元の文字列: ConfigKey=ServerHost123
Key: ConfigKey
Value: ServerHost123
注意点: ArgumentOutOfRangeException
Substringを使用する際、startIndexやlengthに指定した値が、文字列の実際の長さを超えていた場合、プログラムはArgumentOutOfRangeExceptionという実行時エラーをスローして停止します。
IndexOfが-1を返した場合(キーワードが見つからなかった場合)に、その-1をSubstringに渡してしまうと、この例外が発生します。そのため、IndexOfと組み合わせる際は、必ず!= -1かどうかをチェック(ガード)することが重要です。
まとめ
string.Substringメソッドは、C#で文字列の一部を切り出すための必須の機能です。
Substring(int startIndex): 指定位置から最後までを抽出します。Substring(int startIndex, int length): 指定位置から指定した文字数を抽出します。
IndexOfメソッドと組み合わせることで、区切り文字に基づいた柔軟な文字列の解析と抽出が可能になります。
