Menu

C#の文字列メソッド:Split、Replace、Contains、IndexOf、Trim、Joinなど

C#で毎日使うStringのメソッドを解説します。複数の区切り文字とオプションを使うSplit、Replace、Containsと大文字小文字を区別しない検索、IndexOfとLastIndexOf、StartsWithとEndsWith、Trim、ToUpperとToLower、PadLeft、Join、Concat、そして文字列の反転を扱います。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

System.String には何十ものメソッドがあります。このページでは、実際のコードで大部分の仕事をするものを、重要なオプションや落とし穴とともに扱います。すべてに当てはまるルールが1つあります。文字列は不変なので、どのメソッドも新しい文字列(または値)を返し、元の文字列は変わりません。単独の行の s.Trim(); は何もしないので、s = s.Trim(); と書きます。

Split

Split は、区切り文字ごとに文字列を分けて string[] にします。

出力:

3
apple
banana
cherry
red/green/ blue/yellow
INFO/started/ready

" blue" に注目してください。Split は区切り文字のところでちょうど切り、空白は残します。よくある後片付けには2つのオプションがあります。

出力:

5
4
c#|dotnet|linq
key=[Subject] value=[Re: Meeting: Friday]
3

RemoveEmptyEntries は長さゼロの部分を落としますが、空白だけの部分は落としません(上では " " が残りました)。.NET 5では StringSplitOptions.TrimEntries が追加され、2つを組み合わせられます:tags.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) なら1回の呼び出しできれいな結果が得られます。区切り文字として null を渡すと任意の空白で分割され、テキストを単語に分ける一般的な方法です。

1つの char で分割するなら(Split(','))配列は不要です。char とオプション、または1つの string を受け取るオーバーロードは.NET Core 2.0以降にあります。上で使った配列の形は、.NET FrameworkやUnityを含め、どこでも動きます。

Replace

Replace は、文字や部分文字列のすべての出現を置き換えます。

出力:

5551234567
555.123.4567
Cats and dogs and CATS
dogs and dogs and dogs
dogs and cats and CATS
too many spaces

StringComparison 引数を取るオーバーロードは、.NET Core 2.0以降で使えます。.NET Frameworkでは、大文字と小文字を区別しない置換は Regex.Replace(text, Regex.Escape(find), replacement, RegexOptions.IgnoreCase) で行います。"" で置き換えれば文字を削除でき、少数の置換なら Replace の呼び出しを連ねても問題ありません。

Contains、IndexOf、StartsWith、EndsWith

これらのメソッドは検索を行います。Contains ははい・いいえで答え、IndexOf と LastIndexOf は位置を返し、一致がなければ-1を返します。StartsWith と EndsWith は両端を判定します。

出力:

True
False
True
True
8
30
28
-1
16
False
True
True

これらはすべて、既定で大文字と小文字を区別します。Contains(string, StringComparison) は.NET Core 2.1以降にあります。IndexOf(...) >= 0 の形はすべてのバージョンで動くので、古いコードではこちらを目にします。IndexOfAny(new[] { ',', ';' }) は、複数の文字のうち最初に現れるものを見つけます。

カルチャについての注意:StringComparison がないと、StartsWith、EndsWith、IndexOf(string)、CompareTo はカルチャに依存する規則を使い、Contains、Replace、IndexOf(char) は序数で比較します。StringComparison.Ordinal か OrdinalIgnoreCase を明示的に渡せばあいまいさがなくなり、コード分析ツールもそれを勧めています。

Trim、TrimStart、TrimEnd

Trim は両端の空白(スペース、タブ、改行)を取り除きます。TrimStart と TrimEnd は片方の端から取り除きます。文字を渡すと、代わりにその文字を取り除きます。

出力:

[ana@example.com]
[ana@example.com \n]
[  x]
SALE
7
path/to/dir
1,234.50

Trim が触れるのは両端だけで、文字列の中の空白は残ります。"000" に対する TrimStart('0') は空の文字列を返すので、数値の文字列は手でゼロを取り除かずに int.Parse で解析します。

ToUpperとToLower

出力:

MAYA LOPEZ
maya lopez
MAYA LOPEZ
Coffee

ToUpper と ToLower は現在のカルチャに従うので、トルコ語では "i".ToUpper() は I ではなく点付きの大文字İになります。識別子、キー、ファイル名には ToUpperInvariant と ToLowerInvariant を使います。比較には、大文字小文字を変換するのではなく StringComparison を使います(文字列を参照)。すべての単語の先頭を大文字にするには CultureInfo.CurrentCulture.TextInfo.ToTitleCase(text) がありますが、すでにすべて大文字の単語はそのままにします。

PadLeftとPadRight

パディングは、文字列が全体の幅に達するまで文字を加えます。固定幅の出力や、コードのゼロ埋めに便利です。

出力:

000042
[Tea     ]
[     Tea]
Too long already
Espresso..  2.40
Latte.....  3.60
Mocha.....  3.95

補間の配置({name,-10})も、その場で同じ役割を果たします。

JoinとConcat

string.Join は、任意のコレクションの要素の間に区切り文字を置きます。string.Concat は区切り文字なしでつなぎます。

出力:

Ana, Ben, Chloe
1 + 2 + 3
True
2026-09
AnaBenChloe
Ana, Ben and Chloe

区切り文字付きのリストを作るには Join が正しい方法です。取り除くべき末尾の区切り文字がなく、1回の走査で結果を作ります。各要素の ToString() を呼ぶので、数値やオブジェクトにも使えます。

Reverse、Insert、Remove

文字列を返す string.Reverse メソッドはありません。一般的な方法は2つです。

出力:

desserts
desserts
True
2026/Q3-09
Hello
HelloWorld

word.Reverse() だけでは文字列ではなく IEnumerable<char> が返り、表示すると型名が出ます。どちらの方法もUTF-16のコード単位を反転するので、2つの単位からなる文字(ほとんどの絵文字)や結合用のアクセント記号付きの文字は壊れます。

早見表

やりたいことメソッド
部分に分割するs.Split(',')、s.Split(new[] {',', ';'}, StringSplitOptions.RemoveEmptyEntries)
すべて置換するs.Replace("a", "b")
含むかs.Contains("x")、s.Contains("x", StringComparison.OrdinalIgnoreCase)
位置s.IndexOf("x")、s.LastIndexOf('x')(なければ-1)
先頭または末尾の判定s.StartsWith("x")、s.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase)
両端の空白を取り除くs.Trim()、s.TrimStart()、s.TrimEnd()
大文字小文字の変換s.ToUpper()、s.ToLowerInvariant()
幅までパディングするs.PadLeft(6, '0')、s.PadRight(10)
コレクションを連結するstring.Join(", ", items)
文字列の一部s.Substring(start, length)
挿入または削除s.Insert(i, "x")、s.Remove(i, count)
nullまたは空白の確認string.IsNullOrWhiteSpace(s)

よくある質問

C#で文字列を分割するには?

text.Split(',') は、カンマの間の部分からなる string[] を返します。複数の区切り文字は配列で渡し(Split(new[] { ',', ';' }))、文字列の区切りは Split(new[] { ", " }, StringSplitOptions.None) で指定し、区切り文字が重なってできる空の部分を落とすには StringSplitOptions.RemoveEmptyEntries を使います。.NET 5では、各部分をトリムする StringSplitOptions.TrimEntries が追加されました。

大文字と小文字を区別せずに文字列が別の文字列を含むか確認するには?

.NET Core 2.1以降では text.Contains("error", StringComparison.OrdinalIgnoreCase) です。そのオーバーロードがない.NET Frameworkでは、text.IndexOf("error", StringComparison.OrdinalIgnoreCase) >= 0 を使います。text.ToLower().Contains(...) は、コピーを割り当て、一部のカルチャで誤動作することがあるので避けます。

C#のString.Replaceは元の文字列を変更しますか?

変更しません。文字列は不変なので、Replace はすべての出現を置き換えた新しい文字列を返し、元の文字列はそのままです。s = s.Replace("old", "new"); と書きます。置き換えるのは最初の1つだけでなくすべての出現です。最初の1つだけを置き換えるには、IndexOf で見つけて文字列を組み立て直すか、Regex のインスタンスの Replace を回数1で呼びます。

文字列が見つからないとIndexOfは何を返しますか?

-1を返します。0以上の結果は、最初に一致した位置(0から始まる)です。結果をインデックスとして使う前に、必ず-1を確認します。Substring(-1) は例外を投げ、Substring(-1 + 1) は何も言わずに文字列全体を返すからです。LastIndexOf も同じように動き、末尾から探します。

C#で文字列を反転するには?

char配列にコピーし、配列を反転して、新しい文字列を作ります:char[] a = s.ToCharArray(); Array.Reverse(a); string r = new string(a);。LINQなら new string(s.Reverse().ToArray()) で同じことができます。どちらもUTF-16の単位を反転するので、絵文字や結合用のアクセント記号は崩れることがあります。

Coddy programming languages illustration

Coddyでコードを学ぼう

始める