C#で文字列を切り出す方法まとめ|Substring・Range・Splitの使い分けを初心者向けに解説
はじめに
C#で文字列を切り出すときは、主にSubstring、Range演算子、Splitを使います。
たとえば、次のような処理です。
C#string text = "Hello, C#";
// 途中から切り出す
string result1 = text.Substring(7); // C#
// 範囲を指定して切り出す
string result2 = text[0..5]; // Hello
// 区切り文字で分割する
string[] parts = text.Split(',');
「文字列の何文字目から切り出したいのか」「区切り文字で分けたいのか」「前後の文字を基準に抽出したいのか」によって、使う方法は変わります。
この記事では、C#で文字列を切り出す基本から、Substring、Range、Split、IndexOfを使った実践的な方法まで、初心者向けにわかりやすく解説します。
1. C#で文字列を切り出す基本
1-1. C#の文字列切り出しでできること
C#の文字列切り出しでは、文字列の一部だけを取り出せます。
たとえば、次のような処理ができます。
C#string text = "ABCDE";
string a = text.Substring(0, 2); // AB
string b = text.Substring(2, 3); // CDE
文字列の切り出しは、ファイル名、メールアドレス、URL、CSV、日付文字列などを扱う場面でよく使います。
C#string email = "user@example.com";
int index = email.IndexOf("@");
string userName = email.Substring(0, index);
Console.WriteLine(userName); // user
このように、文字列の中から必要な部分だけを取り出す処理は、実務でも頻繁に登場します。
1-2. 文字列の位置は0から数える
C#では、文字列の位置を0から数えます。
C#string text = "ABCDE";
この文字列の位置は次のようになります。
C#A B C D E
0 1 2 3 4
たとえば、Cを取り出したい場合は、位置は2です。
C#string text = "ABCDE";
char c = text[2];
Console.WriteLine(c); // C
初心者がつまずきやすいポイントは、「1文字目は1ではなく0」という点です。
1-3. 文字数とインデックスの違い
C#で文字列を切り出すときは、「インデックス」と「文字数」の違いを理解しておく必要があります。
C#string text = "ABCDE";
string result = text.Substring(1, 3);
Console.WriteLine(result); // BCD
この例では、Substring(1, 3)と書いています。
意味は次のとおりです。
C#開始位置: 1
文字数: 3
つまり、インデックス1のBから、3文字分のBCDを切り出します。
Substringの第2引数は「終了位置」ではなく「切り出す文字数」です。ここを間違えると、想定外の文字列になったり、エラーが発生したりします。
1-4. Substring・Range・Splitの使い分け早見表
C#で文字列を切り出す代表的な方法は、次のように使い分けます。
| 方法 | 向いているケース | 例 |
|---|---|---|
Substring | 開始位置や文字数が決まっている | 先頭3文字を取得 |
| Range演算子 | 範囲を直感的に指定したい | text[1..4] |
Split | 区切り文字で分割したい | カンマ区切りを分割 |
IndexOf + Substring | 特定の文字を基準に切り出したい | @より前を取得 |
| 正規表現 | 条件が複雑な文字列を抽出したい | 数字だけ抽出 |
まずはSubstringとSplitを覚え、慣れてきたらRange演算子やIndexOfとの組み合わせを使うとよいでしょう。
2. Substringで指定位置から文字列を切り出す方法
2-1. Substringの基本構文
Substringは、C#で文字列を切り出す基本的なメソッドです。
構文は次の2種類です。
C#文字列.Substring(開始位置)
文字列.Substring(開始位置, 文字数)
開始位置だけを指定すると、その位置から末尾まで切り出します。
C#string text = "ABCDE";
string result = text.Substring(2);
Console.WriteLine(result); // CDE
開始位置と文字数を指定すると、指定した位置から指定した文字数分だけ切り出します。
C#string text = "ABCDE";
string result = text.Substring(1, 3);
Console.WriteLine(result); // BCD
2-2. 開始位置を指定して末尾まで切り出す
開始位置から末尾まで切り出したい場合は、Substringに開始位置だけを指定します。
C#string text = "Hello World";
string result = text.Substring(6);
Console.WriteLine(result); // World
Substring(6)は、インデックス6の文字から最後までを取り出します。
C#H e l l o W o r l d
0 1 2 3 4 5 6 7 8 9 10
インデックス6はWなので、結果はWorldになります。
2-3. 開始位置と文字数を指定して切り出す
指定した位置から指定文字数だけ切り出すには、Substring(開始位置, 文字数)を使います。
C#string text = "Hello World";
string result = text.Substring(0, 5);
Console.WriteLine(result); // Hello
この例では、インデックス0から5文字分を切り出しています。
途中の文字列を取得することもできます。
C#string text = "2026-06-06";
string month = text.Substring(5, 2);
Console.WriteLine(month); // 06
日付文字列のように、位置が固定されている文字列を扱うときに便利です。
2-4. 先頭から指定文字数だけ切り出す
先頭から指定文字数だけ切り出す場合は、開始位置に0を指定します。
C#string text = "ABCDE";
string result = text.Substring(0, 3);
Console.WriteLine(result); // ABC
先頭の3文字だけを取得したい場合などによく使います。
ただし、文字列が3文字未満の場合はエラーになります。
C#string text = "AB";
// string result = text.Substring(0, 3); // エラー
安全に処理したい場合は、Lengthを確認します。
C#string text = "AB";
string result = text.Length >= 3
? text.Substring(0, 3)
: text;
Console.WriteLine(result); // AB
2-5. 末尾から指定文字数だけ切り出す
末尾から指定文字数だけ切り出す場合は、Lengthを使って開始位置を計算します。
C#string text = "ABCDE";
string result = text.Substring(text.Length - 2);
Console.WriteLine(result); // DE
text.Lengthは文字列の長さです。
C#string text = "ABCDE";
Console.WriteLine(text.Length); // 5
末尾2文字を取りたい場合は、開始位置を5 - 2 = 3にします。
C#string result = text.Substring(3); // DE
ただし、文字列が指定文字数より短い場合は注意が必要です。
C#string text = "A";
int count = 2;
string result = text.Length >= count
? text.Substring(text.Length - count)
: text;
Console.WriteLine(result); // A
2-6. Substringで発生しやすいエラーと対処法
Substringでよく発生するエラーがArgumentOutOfRangeExceptionです。
たとえば、次のコードはエラーになります。
C#string text = "ABC";
string result = text.Substring(5);
文字列の長さは3なのに、存在しないインデックス5から切り出そうとしているためです。
次のコードもエラーになります。
C#string text = "ABC";
string result = text.Substring(1, 5);
インデックス1から5文字分を切り出そうとすると、文字列の範囲を超えてしまいます。
安全に書くなら、事前に範囲を確認します。
C#string text = "ABC";
int start = 1;
int length = 2;
if (start >= 0 && start < text.Length && start + length <= text.Length)
{
string result = text.Substring(start, length);
Console.WriteLine(result);
}
else
{
Console.WriteLine("指定範囲が不正です");
}
Substringを使うときは、「開始位置が範囲内か」「開始位置 + 文字数が文字列の長さを超えていないか」を確認しましょう。
3. Range演算子で文字列を直感的に切り出す方法
3-1. Range演算子とは
Range演算子は、..を使って文字列の範囲を指定する書き方です。
C#string text = "ABCDE";
string result = text[1..4];
Console.WriteLine(result); // BCD
text[1..4]は、インデックス1からインデックス4の手前までを切り出します。
C#A B C D E
0 1 2 3 4
つまり、BからDまでが取得されます。
Range演算子はC# 8.0以降で使える書き方です。Substringよりも範囲が見た目でわかりやすいのが特徴です。
3-2. s[開始..終了]で範囲指定する
Range演算子の基本構文は次のとおりです。
C#文字列[開始..終了]
注意点は、終了位置の文字は含まれないことです。
C#string text = "ABCDE";
string result = text[1..3];
Console.WriteLine(result); // BC
1..3は、インデックス1からインデックス3の手前までです。
C#開始: 1
終了: 3の手前
結果: B, C
Substring(1, 2)と同じ意味になります。
C#string text = "ABCDE";
string a = text.Substring(1, 2);
string b = text[1..3];
Console.WriteLine(a); // BC
Console.WriteLine(b); // BC
3-3. 先頭から・途中から・末尾まで切り出す
Range演算子では、開始位置や終了位置を省略できます。
先頭から指定位置の手前まで切り出す場合は、開始位置を省略します。
C#string text = "ABCDE";
string result = text[..3];
Console.WriteLine(result); // ABC
途中から末尾まで切り出す場合は、終了位置を省略します。
C#string text = "ABCDE";
string result = text[2..];
Console.WriteLine(result); // CDE
全体を取得する場合は、両方を省略します。
C#string text = "ABCDE";
string result = text[..];
Console.WriteLine(result); // ABCDE
Substringよりも「どこからどこまで」を視覚的に書きやすいのがメリットです。
3-4. ^を使って後ろから位置を指定する
Range演算子では、^を使うと末尾から数えた位置を指定できます。
C#string text = "ABCDE";
string result = text[^2..];
Console.WriteLine(result); // DE
^2は「後ろから2番目の位置」を表します。
末尾1文字を取得する場合は、次のように書けます。
C#string text = "ABCDE";
char lastChar = text[^1];
Console.WriteLine(lastChar); // E
末尾3文字を切り出す場合は、次のようにします。
C#string text = "ABCDE";
string result = text[^3..];
Console.WriteLine(result); // CDE
末尾を基準にした切り出しでは、Substring(text.Length - 3)よりも短く読みやすく書けます。
3-5. SubstringとRangeの違い
SubstringとRange演算子は、どちらも文字列を切り出すために使えます。
C#string text = "ABCDE";
string a = text.Substring(1, 3);
string b = text[1..4];
Console.WriteLine(a); // BCD
Console.WriteLine(b); // BCD
違いは、指定方法です。
Substring(1, 3)は、「開始位置1から3文字分」という意味です。
一方、text[1..4]は、「インデックス1からインデックス4の手前まで」という意味です。
| 書き方 | 意味 |
|---|---|
Substring(1, 3) | 1番目から3文字分 |
text[1..4] | 1番目から4番目の手前まで |
初心者は、Substringの第2引数を終了位置と勘違いしやすいです。その点、Range演算子は範囲指定として直感的に読めます。
ただし、既存コードや古い環境ではSubstringがよく使われています。まずはSubstringを理解し、次にRange演算子を覚えるとよいでしょう。
4. Splitで区切り文字ごとに文字列を分割する方法
4-1. Splitの基本構文
Splitは、文字列を区切り文字で分割するメソッドです。
C#string text = "A,B,C";
string[] parts = text.Split(',');
Console.WriteLine(parts[0]); // A
Console.WriteLine(parts[1]); // B
Console.WriteLine(parts[2]); // C
Substringは位置を指定して切り出すのに対して、Splitは区切り文字を基準に文字列を分割します。
CSV、ログ、スペース区切りの文字列などを扱うときに便利です。
4-2. カンマ区切りの文字列を分割する
カンマ区切りの文字列を分割するには、Split(',')を使います。
C#string csv = "apple,banana,orange";
string[] fruits = csv.Split(',');
foreach (string fruit in fruits)
{
Console.WriteLine(fruit);
}
実行結果は次のとおりです。
C#apple
banana
orange
特定の項目だけ取り出したい場合は、配列のインデックスを指定します。
C#string csv = "apple,banana,orange";
string[] fruits = csv.Split(',');
Console.WriteLine(fruits[1]); // banana
4-3. 半角スペースや改行で分割する
半角スペースで分割する場合は、次のように書きます。
C#string text = "C# Java Python";
string[] languages = text.Split(' ');
foreach (string language in languages)
{
Console.WriteLine(language);
}
改行で分割する場合は、Environment.NewLineや文字配列を使います。
C#string text = "A\nB\nC";
string[] lines = text.Split('\n');
foreach (string line in lines)
{
Console.WriteLine(line);
}
Windowsの改行は\r\nの場合があります。そのため、複数の改行コードに対応したい場合は、次のように書くと便利です。
C#string text = "A\r\nB\nC";
string[] lines = text.Split(
new[] { "\r\n", "\n" },
StringSplitOptions.None
);
foreach (string line in lines)
{
Console.WriteLine(line);
}
4-4. 複数の区切り文字を指定する
複数の区切り文字で分割したい場合は、文字配列を指定します。
C#string text = "apple,banana;orange";
char[] separators = { ',', ';' };
string[] parts = text.Split(separators);
foreach (string part in parts)
{
Console.WriteLine(part);
}
実行結果は次のとおりです。
C#apple
banana
orange
カンマ、セミコロン、スペースなど、複数の区切り文字が混在している文字列に使えます。
C#string text = "A,B;C D";
char[] separators = { ',', ';', ' ' };
string[] parts = text.Split(separators);
4-5. 空文字を除外して分割する
連続した区切り文字があると、分割結果に空文字が含まれることがあります。
C#string text = "A,,B,C";
string[] parts = text.Split(',');
foreach (string part in parts)
{
Console.WriteLine($"[{part}]");
}
実行結果は次のようになります。
C#[A]
[]
[B]
[C]
空文字を除外したい場合は、StringSplitOptions.RemoveEmptyEntriesを指定します。
C#string text = "A,,B,C";
string[] parts = text.Split(
',',
StringSplitOptions.RemoveEmptyEntries
);
foreach (string part in parts)
{
Console.WriteLine(part);
}
実行結果は次のとおりです。
C#A
B
C
不要な空データを取り除きたい場合に便利です。
4-6. SplitとSubstringの使い分け
SplitとSubstringは、用途が違います。
Substringは、位置が決まっている文字列に向いています。
C#string date = "2026-06-06";
string year = date.Substring(0, 4);
Console.WriteLine(year); // 2026
Splitは、区切り文字で分かれている文字列に向いています。
C#string date = "2026-06-06";
string[] parts = date.Split('-');
Console.WriteLine(parts[0]); // 2026
Console.WriteLine(parts[1]); // 06
Console.WriteLine(parts[2]); // 06
位置が固定ならSubstring、区切り文字があるならSplitを使うと覚えておくとよいでしょう。
5. IndexOf・LastIndexOfと組み合わせて必要な部分だけ切り出す
5-1. 特定の文字より前を切り出す
特定の文字より前を切り出す場合は、IndexOfで位置を調べてからSubstringを使います。
C#string email = "user@example.com";
int index = email.IndexOf("@");
string userName = email.Substring(0, index);
Console.WriteLine(userName); // user
IndexOf("@")は、@が最初に出てくる位置を返します。
C#string email = "user@example.com";
Console.WriteLine(email.IndexOf("@")); // 4
その位置までをSubstring(0, index)で切り出すことで、@より前の文字列を取得できます。
5-2. 特定の文字より後ろを切り出す
特定の文字より後ろを切り出す場合も、IndexOfを使います。
C#string email = "user@example.com";
int index = email.IndexOf("@");
string domain = email.Substring(index + 1);
Console.WriteLine(domain); // example.com
@自体を含めたくないため、開始位置はindex + 1にします。
URLやファイルパスなどでも同じ考え方が使えます。
C#string path = "folder/file.txt";
int index = path.IndexOf("/");
string fileName = path.Substring(index + 1);
Console.WriteLine(fileName); // file.txt
5-3. 開始文字と終了文字に挟まれた部分を切り出す
開始文字と終了文字に挟まれた部分を切り出すには、開始位置と終了位置をそれぞれ取得します。
C#string text = "商品名: [りんご]";
int start = text.IndexOf("[");
int end = text.IndexOf("]");
string result = text.Substring(start + 1, end - start - 1);
Console.WriteLine(result); // りんご
ポイントは、文字数の計算です。
C#end - start - 1
開始文字[と終了文字]を含めないため、-1しています。
Range演算子を使うと、次のようにも書けます。
C#string text = "商品名: [りんご]";
int start = text.IndexOf("[");
int end = text.IndexOf("]");
string result = text[(start + 1)..end];
Console.WriteLine(result); // りんご
5-4. 最後に出てくる区切り文字を基準に切り出す
最後に出てくる区切り文字を基準にしたい場合は、LastIndexOfを使います。
C#string path = "C:/work/sample/file.txt";
int index = path.LastIndexOf("/");
string fileName = path.Substring(index + 1);
Console.WriteLine(fileName); // file.txt
IndexOfは最初に見つかった位置を返しますが、LastIndexOfは最後に見つかった位置を返します。
ファイルパスからファイル名だけを取り出すときに便利です。
C#string path = "C:/work/sample/file.txt";
int index = path.LastIndexOf("/");
string folder = path.Substring(0, index);
Console.WriteLine(folder); // C:/work/sample
5-5. 見つからない場合の安全な処理
IndexOfやLastIndexOfは、対象の文字が見つからない場合に-1を返します。
C#string text = "ABC";
int index = text.IndexOf("@");
Console.WriteLine(index); // -1
-1のままSubstringに使うとエラーになります。
C#string text = "ABC";
int index = text.IndexOf("@");
// string result = text.Substring(0, index); // エラー
安全に処理するには、-1かどうかを確認します。
C#string text = "user@example.com";
int index = text.IndexOf("@");
if (index >= 0)
{
string result = text.Substring(0, index);
Console.WriteLine(result);
}
else
{
Console.WriteLine("@が見つかりません");
}
文字列を切り出す前には、対象の文字が存在するかを確認する習慣をつけましょう。
6. よくある文字列切り出しパターン別サンプル
6-1. ファイル名から拡張子を切り出す
ファイル名から拡張子を切り出すには、最後の.を基準にします。
C#string fileName = "sample.txt";
int index = fileName.LastIndexOf(".");
string extension = fileName.Substring(index + 1);
Console.WriteLine(extension); // txt
.を含めたい場合は、indexから切り出します。
C#string fileName = "sample.txt";
int index = fileName.LastIndexOf(".");
string extension = fileName.Substring(index);
Console.WriteLine(extension); // .txt
より安全に書くなら、.が存在するか確認します。
C#string fileName = "sample.txt";
int index = fileName.LastIndexOf(".");
if (index >= 0)
{
string extension = fileName.Substring(index + 1);
Console.WriteLine(extension);
}
else
{
Console.WriteLine("拡張子がありません");
}
6-2. メールアドレスからユーザー名とドメインを切り出す
メールアドレスから@より前と後ろを切り出します。
C#string email = "user@example.com";
int index = email.IndexOf("@");
if (index >= 0)
{
string userName = email.Substring(0, index);
string domain = email.Substring(index + 1);
Console.WriteLine(userName); // user
Console.WriteLine(domain); // example.com
}
Splitを使っても分割できます。
C#string email = "user@example.com";
string[] parts = email.Split('@');
if (parts.Length == 2)
{
Console.WriteLine(parts[0]); // user
Console.WriteLine(parts[1]); // example.com
}
単純に@で分けるだけならSplit、細かい位置制御をしたいならIndexOfとSubstringを使うとよいでしょう。
6-3. URLから必要な部分を切り出す
URLからドメイン部分を切り出す例です。
C#string url = "https://example.com/products/item1";
string prefix = "https://";
int start = url.IndexOf(prefix);
if (start >= 0)
{
start += prefix.Length;
int end = url.IndexOf("/", start);
string domain = end >= 0
? url.Substring(start, end - start)
: url.Substring(start);
Console.WriteLine(domain); // example.com
}
IndexOfの第2引数を使うと、指定した位置以降から検索できます。
C#int end = url.IndexOf("/", start);
URLのように構造がある文字列は、IndexOfとSubstringを組み合わせると柔軟に切り出せます。
ただし、本格的にURLを解析する場合は、Uriクラスを使う方が安全です。
C#string url = "https://example.com/products/item1";
Uri uri = new Uri(url);
Console.WriteLine(uri.Host); // example.com
Console.WriteLine(uri.AbsolutePath); // /products/item1
6-4. CSVの1行を項目ごとに分割する
CSVの1行を分割するには、Split(',')を使います。
C#string line = "001,山田太郎,Tokyo";
string[] columns = line.Split(',');
Console.WriteLine(columns[0]); // 001
Console.WriteLine(columns[1]); // 山田太郎
Console.WriteLine(columns[2]); // Tokyo
項目数を確認してから取り出すと安全です。
C#string line = "001,山田太郎,Tokyo";
string[] columns = line.Split(',');
if (columns.Length >= 3)
{
string id = columns[0];
string name = columns[1];
string address = columns[2];
Console.WriteLine($"{id}: {name} - {address}");
}
ただし、値にカンマが含まれるCSVでは、単純なSplit(',')では正しく処理できない場合があります。
C#string line = "001,\"山田,太郎\",Tokyo";
このような正式なCSVを扱う場合は、CSVパーサーや専用ライブラリの利用を検討しましょう。
6-5. 日付文字列から年・月・日を切り出す
日付文字列の形式が固定されている場合は、Substringで切り出せます。
C#string date = "2026-06-06";
string year = date.Substring(0, 4);
string month = date.Substring(5, 2);
string day = date.Substring(8, 2);
Console.WriteLine(year); // 2026
Console.WriteLine(month); // 06
Console.WriteLine(day); // 06
Splitを使う方法もあります。
C#string date = "2026-06-06";
string[] parts = date.Split('-');
Console.WriteLine(parts[0]); // 2026
Console.WriteLine(parts[1]); // 06
Console.WriteLine(parts[2]); // 06
日付として扱う場合は、文字列のまま切り出すよりもDateTimeに変換する方が安全です。
C#string dateText = "2026-06-06";
DateTime date = DateTime.Parse(dateText);
Console.WriteLine(date.Year); // 2026
Console.WriteLine(date.Month); // 6
Console.WriteLine(date.Day); // 6
7. 文字列切り出しで初心者がつまずきやすいポイント
7-1. ArgumentOutOfRangeExceptionが起きる原因
ArgumentOutOfRangeExceptionは、指定した範囲が文字列の長さを超えたときに発生します。
C#string text = "ABC";
string result = text.Substring(1, 5);
このコードでは、インデックス1から5文字分を切り出そうとしています。しかし、ABCの長さは3なので、範囲を超えています。
安全に処理するには、次の条件を確認します。
C#start >= 0
start < text.Length
length >= 0
start + length <= text.Length
コードにすると次のようになります。
C#string text = "ABC";
int start = 1;
int length = 2;
if (start >= 0 && start < text.Length && length >= 0 && start + length <= text.Length)
{
string result = text.Substring(start, length);
Console.WriteLine(result);
}
Substringを使うときは、必ず範囲外にならないかを意識しましょう。
7-2. nullや空文字を扱うときの注意点
文字列がnullの場合、SubstringやSplitを呼び出すとNullReferenceExceptionが発生します。
C#string text = null;
// string result = text.Substring(0, 1); // エラー
安全に処理するには、string.IsNullOrEmptyを使います。
C#string text = null;
if (!string.IsNullOrEmpty(text))
{
string result = text.Substring(0, 1);
Console.WriteLine(result);
}
else
{
Console.WriteLine("文字列がnullまたは空です");
}
空白だけの文字列も除外したい場合は、string.IsNullOrWhiteSpaceを使います。
C#string text = " ";
if (!string.IsNullOrWhiteSpace(text))
{
Console.WriteLine(text.Substring(0, 1));
}
else
{
Console.WriteLine("文字列が空白です");
}
7-3. 全角文字・絵文字・サロゲートペアの注意点
C#のstring.Lengthは、見た目の文字数ではなく、内部的なcharの数を返します。
日本語の全角文字は、多くの場合そのまま扱えます。
C#string text = "あいうえお";
Console.WriteLine(text.Length); // 5
string result = text.Substring(0, 2);
Console.WriteLine(result); // あい
しかし、絵文字など一部の文字は注意が必要です。
C#string text = "😀";
Console.WriteLine(text.Length); // 2
見た目は1文字でも、内部的には2つのcharで表される場合があります。
そのため、絵文字を含む文字列を単純にSubstringで切り出すと、文字が壊れる可能性があります。
C#string text = "😀ABC";
// string result = text.Substring(0, 1); // 絵文字が壊れる可能性がある
絵文字や複雑な文字を正確に扱う場合は、見た目上の文字単位で処理する方法を検討する必要があります。
7-4. Lengthの値と見た目の文字数が合わないケース
Lengthは見た目の文字数と一致しないことがあります。
たとえば、絵文字や結合文字を含む場合です。
C#string text = "👨👩👧👦";
Console.WriteLine(text.Length);
このような文字は、複数のcharが組み合わさって1つの絵文字として表示されています。
そのため、画面上では1文字に見えても、Lengthでは複数として数えられます。
通常の英数字や日本語だけを扱う場合は大きな問題になりにくいですが、絵文字を含むユーザー入力を扱う場合は注意が必要です。
7-5. 範囲外アクセスを防ぐ書き方
範囲外アクセスを防ぐには、切り出す前に長さを確認します。
先頭から指定文字数を切り出す場合は、次のように書けます。
C#string text = "AB";
int count = 3;
string result = text.Length >= count
? text.Substring(0, count)
: text;
Console.WriteLine(result); // AB
末尾から指定文字数を切り出す場合は、次のようにします。
C#string text = "AB";
int count = 3;
string result = text.Length >= count
? text.Substring(text.Length - count)
: text;
Console.WriteLine(result); // AB
Math.Minを使う方法もあります。
C#string text = "AB";
int count = 3;
string result = text.Substring(0, Math.Min(count, text.Length));
Console.WriteLine(result); // AB
範囲外エラーを避けたい場合は、Lengthを確認してから切り出すのが基本です。
8. Substring・Range・Split以外の文字列切り出し方法
8-1. 正規表現でパターンに合う文字列を抽出する
条件に合う文字列を抽出したい場合は、正規表現を使う方法があります。
C#using System.Text.RegularExpressions;
string text = "注文番号: ABC-12345";
Match match = Regex.Match(text, @"[A-Z]+-\d+");
if (match.Success)
{
Console.WriteLine(match.Value); // ABC-12345
}
正規表現は、特定の形式に一致する文字列を取り出すのに便利です。
たとえば、数字だけを抽出する場合は次のように書けます。
C#using System.Text.RegularExpressions;
string text = "価格: 1200円";
Match match = Regex.Match(text, @"\d+");
if (match.Success)
{
Console.WriteLine(match.Value); // 1200
}
単純な位置指定ならSubstring、複雑な条件なら正規表現が向いています。
8-2. Removeで不要な部分を削除する
Removeは、指定した位置から文字列を削除するメソッドです。
C#string text = "ABCDE";
string result = text.Remove(2);
Console.WriteLine(result); // AB
Remove(2)は、インデックス2以降を削除します。
削除する文字数を指定することもできます。
C#string text = "ABCDE";
string result = text.Remove(1, 2);
Console.WriteLine(result); // ADE
Substringは必要な部分を取り出すメソッド、Removeは不要な部分を削除するメソッドです。
結果として似た文字列を作れることもありますが、考え方が違います。
8-3. Trimで前後の空白を取り除く
Trimは、文字列の前後にある空白を取り除くメソッドです。
C#string text = " Hello ";
string result = text.Trim();
Console.WriteLine(result); // Hello
前だけ取り除く場合はTrimStart、後ろだけ取り除く場合はTrimEndを使います。
C#string text = " Hello ";
Console.WriteLine(text.TrimStart()); // Hello
Console.WriteLine(text.TrimEnd()); // Hello
ユーザー入力やCSVの項目を整形するときによく使います。
C#string csv = " apple , banana , orange ";
string[] parts = csv.Split(',');
foreach (string part in parts)
{
Console.WriteLine(part.Trim());
}
8-4. Replaceと組み合わせて整形する
Replaceは、文字列の一部を別の文字列に置き換えるメソッドです。
C#string text = "2026/06/06";
string result = text.Replace("/", "-");
Console.WriteLine(result); // 2026-06-06
切り出しの前に不要な文字を削除する使い方もできます。
C#string text = "TEL: 03-1234-5678";
string number = text.Replace("TEL: ", "");
Console.WriteLine(number); // 03-1234-5678
空白を取り除いてから分割することもあります。
C#string text = "A, B, C";
string cleaned = text.Replace(" ", "");
string[] parts = cleaned.Split(',');
foreach (string part in parts)
{
Console.WriteLine(part);
}
文字列を切り出す前に整形したい場合、ReplaceやTrimを組み合わせると便利です。
8-5. Spanを使ったパフォーマンス重視の切り出し
大量の文字列処理を行う場合は、SpanやReadOnlySpan<char>を使う方法もあります。
通常のSubstringは、新しい文字列を作成します。
C#string text = "ABCDE";
string result = text.Substring(1, 3);
一方、AsSpanを使うと、元の文字列を参照したまま一部を扱えます。
C#string text = "ABCDE";
ReadOnlySpan<char> span = text.AsSpan(1, 3);
Console.WriteLine(span.ToString()); // BCD
ただし、最終的に文字列として使う場合はToString()が必要です。
Spanはパフォーマンスを重視する場面で役立ちますが、初心者のうちはSubstring、Range、Splitを優先して覚えれば十分です。
9. C#の文字列切り出し方法の選び方
9-1. 位置が決まっているならSubstring
文字列の位置が決まっている場合は、Substringが向いています。
C#string code = "ABC123";
string prefix = code.Substring(0, 3);
string number = code.Substring(3);
Console.WriteLine(prefix); // ABC
Console.WriteLine(number); // 123
商品コード、日付、固定長データなど、文字数が決まっている文字列に便利です。
C#string date = "20260606";
string year = date.Substring(0, 4);
string month = date.Substring(4, 2);
string day = date.Substring(6, 2);
固定位置の切り出しでは、Substringを使うとシンプルに書けます。
9-2. 読みやすく範囲指定したいならRange
範囲をわかりやすく書きたい場合は、Range演算子が便利です。
C#string text = "ABCDE";
string result = text[1..4];
Console.WriteLine(result); // BCD
先頭から、途中から、末尾からの切り出しも短く書けます。
C#string text = "ABCDE";
Console.WriteLine(text[..3]); // ABC
Console.WriteLine(text[2..]); // CDE
Console.WriteLine(text[^2..]); // DE
C# 8.0以降の環境で、読みやすさを重視するならRange演算子を使うとよいでしょう。
9-3. 区切り文字で分けたいならSplit
カンマ、スペース、ハイフンなどで区切られた文字列は、Splitが向いています。
C#string text = "red,green,blue";
string[] colors = text.Split(',');
foreach (string color in colors)
{
Console.WriteLine(color);
}
日付文字列を分割する場合にも使えます。
C#string date = "2026-06-06";
string[] parts = date.Split('-');
Console.WriteLine(parts[0]); // 2026
Console.WriteLine(parts[1]); // 06
Console.WriteLine(parts[2]); // 06
「何文字目」ではなく「何で区切られているか」で考えられる場合は、Splitを使いましょう。
9-4. 条件が複雑ならIndexOfや正規表現
特定の文字を基準にしたい場合は、IndexOfとSubstringを組み合わせます。
C#string text = "name=tanaka";
int index = text.IndexOf("=");
string value = text.Substring(index + 1);
Console.WriteLine(value); // tanaka
より複雑な条件で抽出したい場合は、正規表現が向いています。
C#using System.Text.RegularExpressions;
string text = "ID: 12345";
Match match = Regex.Match(text, @"\d+");
if (match.Success)
{
Console.WriteLine(match.Value); // 12345
}
単純な区切りならSplit、位置が決まっているならSubstring、条件が複雑ならIndexOfや正規表現を使い分けましょう。
9-5. 初心者におすすめの覚える順番
初心者は、次の順番で覚えるのがおすすめです。
まずはSubstringです。位置を指定して文字列を切り出す基本が学べます。
次にSplitです。カンマ区切りやスペース区切りの文字列を分割できるようになります。
その後、IndexOfとLastIndexOfを覚えると、特定の文字を基準に柔軟な切り出しができるようになります。
最後に、Range演算子や正規表現を覚えると、より読みやすく高度な文字列処理ができます。
C#// 1. Substring
text.Substring(0, 3);
// 2. Split
text.Split(',');
// 3. IndexOf
int index = text.IndexOf("@");
// 4. Range
text[1..4];
// 5. Regex
Regex.Match(text, @"\d+");
この順番で学ぶと、C#の文字列切り出しを無理なく理解できます。
10. C#の文字列切り出しに関するよくある質問
10-1. C#にLeft関数やRight関数はある?
C#には、VBのようなLeft関数やRight関数は標準ではありません。
先頭から切り出す場合は、Substringを使います。
C#string text = "ABCDE";
string left = text.Substring(0, 3);
Console.WriteLine(left); // ABC
末尾から切り出す場合も、Substringで書けます。
C#string text = "ABCDE";
string right = text.Substring(text.Length - 2);
Console.WriteLine(right); // DE
Range演算子を使うと、より簡潔に書けます。
C#string text = "ABCDE";
string left = text[..3];
string right = text[^2..];
Console.WriteLine(left); // ABC
Console.WriteLine(right); // DE
10-2. SubstringとRemoveの違いは?
Substringは、必要な部分を取り出すメソッドです。
C#string text = "ABCDE";
string result = text.Substring(1, 3);
Console.WriteLine(result); // BCD
Removeは、不要な部分を削除するメソッドです。
C#string text = "ABCDE";
string result = text.Remove(1, 3);
Console.WriteLine(result); // AE
同じ文字列から一部を扱うメソッドですが、目的が違います。
必要な部分を取得したいならSubstring、不要な部分を消したいならRemoveを使いましょう。
10-3. Splitした結果から一部だけ取り出すには?
Splitの結果は配列になるため、インデックスを指定して取り出します。
C#string text = "apple,banana,orange";
string[] parts = text.Split(',');
string result = parts[1];
Console.WriteLine(result); // banana
ただし、配列の要素数が足りないとエラーになるため、事前にLengthを確認すると安全です。
C#string text = "apple,banana";
string[] parts = text.Split(',');
if (parts.Length > 1)
{
Console.WriteLine(parts[1]);
}
else
{
Console.WriteLine("指定した要素がありません");
}
10-4. 文字列の最後の1文字を切り出すには?
Substringを使う場合は、Length - 1を指定します。
C#string text = "ABCDE";
string last = text.Substring(text.Length - 1);
Console.WriteLine(last); // E
Range演算子を使う場合は、次のように書けます。
C#string text = "ABCDE";
string last = text[^1..];
Console.WriteLine(last); // E
1文字をcharとして取得するなら、次の書き方もできます。
C#string text = "ABCDE";
char last = text[^1];
Console.WriteLine(last); // E
空文字の場合はエラーになるため、事前に確認しましょう。
C#string text = "";
if (!string.IsNullOrEmpty(text))
{
string last = text.Substring(text.Length - 1);
Console.WriteLine(last);
}
10-5. 日本語の文字列も同じ方法で切り出せる?
日本語の文字列も、基本的には同じ方法で切り出せます。
C#string text = "こんにちは";
string result = text.Substring(0, 2);
Console.WriteLine(result); // こん
Range演算子も使えます。
C#string text = "こんにちは";
string result = text[2..];
Console.WriteLine(result); // にちは
ただし、絵文字や一部の特殊な文字は、見た目の1文字とLengthの数が一致しない場合があります。
通常の日本語文字列であれば、Substring、Range、Splitを同じように使えます。
まとめ
C#で文字列を切り出す方法には、主にSubstring、Range演算子、Splitがあります。
Substringは、開始位置や文字数を指定して文字列を切り出す基本的な方法です。
C#string text = "ABCDE";
string result = text.Substring(1, 3); // BCD
Range演算子を使うと、範囲を直感的に指定できます。
C#string text = "ABCDE";
string result = text[1..4]; // BCD
Splitは、カンマやスペースなどの区切り文字で文字列を分割したいときに使います。
C#string text = "A,B,C";
string[] parts = text.Split(',');
特定の文字を基準に切り出したい場合は、IndexOfやLastIndexOfと組み合わせます。
C#string email = "user@example.com";
int index = email.IndexOf("@");
string userName = email.Substring(0, index);
文字列切り出しで大切なのは、インデックスが0から始まること、Substringの第2引数は終了位置ではなく文字数であること、範囲外を指定するとエラーになることです。
最初はSubstringとSplitをしっかり覚え、慣れてきたらRange演算子やIndexOf、正規表現を使い分けると、C#の文字列処理を効率よく書けるようになります。

