1. 文字列内でサブストリングを探す
前回の講義で、文字列からサブストリングを取り出す方法をやったよね。今回は、ある文字列の中に別の文字列が含まれているかを探す方法をやるよ。これには5つのイケてるメソッドがあるんだ:
Containsメソッド:文字列がサブストリングを含んでる?
渡した文字列が、呼び出した文字列の中に含まれていればtrueを返すよ。
string phrase = "変化の風";
bool hasWord = phrase.Contains("変化"); // true
大文字・小文字は区別されるから注意!"風".Contains("変") — falseだよ。
IndexOfメソッド:サブストリングの位置を探す
配列のIndexOfと似てる感じ:文字列の中でサブストリングを(先頭から末尾に向かって)探して、最初に見つかった位置(インデックス)を返すよ。
string text = "スイカスイカ";
int index = text.IndexOf("イカ"); // 2
- 見つからなかったら-1を返すよ。
- 開始位置を指定できるバージョンもある:IndexOf("イカ", 4)。配列と同じ感じ。
LastIndexOfメソッド:最後の出現位置
これも配列のLastIndexOfと似てる:文字列の中でサブストリングを(末尾から先頭に向かって)探して、最後に見つかった位置(インデックス)を返すよ。
string repeated = "課題 課題";
int last = repeated.LastIndexOf("課題"); // 7
文字列が指定したサブストリングで始まる/終わるか
文字列が特定のサブストリングで始まってるか(または終わってるか)をチェックしたいこともよくあるよね。そのためのメソッドが2つあるよ:
- StartsWith — 文字列が指定したサブストリングで始まってるかチェック;
- EndsWith — 文字列が指定したサブストリングで終わってるかチェック。
string fileName = "photo.jpg";
bool isJpg = fileName.EndsWith(".jpg"); // true
string email = "support@company.com";
bool isSupport = email.StartsWith("support"); // true
大文字・小文字を無視して比較したい場合は、追加パラメータで比較モードを指定する必要があるよ(StringComparison.OrdinalIgnoreCaseをドキュメントでチェックしてね)。
2. Replaceメソッド:文字やサブストリングの置換
Replaceメソッドは、文字列Aのすべての出現箇所を文字列Bに置き換えるよ。タイプミス修正や検閲、テンプレートの変数置換とかに使える!(冗談だけどね。)
string address = "ロンドン, ベイカーストリート";
string updated = address.Replace("ロンドン", "パリ");
Console.WriteLine(updated); // "パリ, ベイカーストリート"
- 1文字だけの置換もできる:str.Replace('あ', 'や')
- 注意:すべての出現箇所が置換されるよ。最初だけじゃない。
3. Splitメソッド:文字列をバラバラに分割
Splitメソッドは、文字列を区切り文字(分割したい記号や文字列)で分割してくれるよ。戻り値は、分割された文字列の配列だよ。
string[] parts = originalString.Split(separator);
- separator — 区切り文字や区切り文字の配列を指定できるよ。
一番シンプルな例
スペースで文字列を分割してみよう:
string input = "りんご なし オレンジ バナナ";
string[] fruits = input.Split(' '); // ["りんご","なし","オレンジ","バナナ"]の配列になる
Console.WriteLine(fruits[0]); // "りんご"
Console.WriteLine(fruits[1]); // "なし"
これで長さ4の文字列配列ができて、各単語が配列の要素になってるよ。
区切り文字が複数ある場合
文字列の中に区切り文字が1種類だけじゃないこともあるよね。例えば、ユーザーがスペースやカンマ、セミコロンで値を区切って入力した場合とか。
そんな時は、区切り文字の配列を使えばOK:
string input = "りんご, なし; オレンジ バナナ";
char[] separators = { ' ', ',', ';' };
string[] fruits = input.Split(separators, StringSplitOptions.RemoveEmptyEntries);
ボーナス:オプションのStringSplitOptions.RemoveEmptyEntriesを使うと、空の要素を除外できるよ。ユーザーが区切り文字を連続で入力した場合(例:スペース2つや"りんご,, なし"みたいなやつ)に便利!
サブストリングで分割
区切り文字は1文字だけじゃなくて、文字列でもOK。例えば、CSVファイルで区切りが";"や|の場合とか:
// 1文字で区切る場合
string data = "イワノフ;ペトロフ;シドロフ";
string[] names = data.Split(';'); // ';'で分割
// 区切りが文字列の場合:
string log = "2024-01-01::エラー::タスクの実行に失敗しました";
string[] separators = { "::" };
string[] parts = log.Split(separators);
4. Joinメソッド:配列の文字列をまとめて1つに
Joinメソッドは逆の動き:文字列の配列を1つの文字列にまとめて、各要素の間に好きな区切り文字を挟んでくれるよ。
string result = string.Join(separator, arrayOfStrings);
- separator — 各要素の間に挟む文字列。
- arrayOfStrings — 文字列の配列やコレクション(string[]、List<string>など)。
一番シンプルな例
文字列配列をカンマ区切りの1つの文字列にしてみよう:
string[] items = { "りんご", "なし", "オレンジ", "バナナ" };
string joined = string.Join(", ", items);
Console.WriteLine(joined); // "りんご, なし, オレンジ, バナナ"
区切り文字なしで連結 — 文字列を1つにまとめる
何も挟まずに文字列を連結したい時もあるよね:
string[] parts = { "僕", "は", "C#が好き" };
string message = string.Join("", parts);
Console.WriteLine(message); // "僕はC#が好き"
5. よくあるミス
初心者がよくやるのが、Splitで分割した後に余計なスペースを消し忘れること。例えば、ユーザーが"りんご, なし ,バナナ"みたいに入力した場合、Split後の要素が" なし "みたいになる。すぐ数値変換や比較に使うとバグるから、Split後は各要素にTrim()を使うクセをつけよう!
もう1つは、空の文字列が混ざること。ユーザーが区切り文字を連続で入力したり、先頭や末尾に区切り文字があると、Splitが空要素を返すことがある。StringSplitOptions.RemoveEmptyEntriesを使って、エラーを防ごう。
Joinに空要素やnullが混ざってると、Joinはそれらを無視するよ。でも、例えばレポートで「値が抜けてる」ことを明示したい場合は、事前に配列を自分で処理しよう。
それと:Splitは元の文字列を絶対に変更しないで、新しい配列を返す。Joinも元の配列を変更せず、新しい文字列を返すよ。覚えておいて:C#の文字列と配列はイミュータブル(変更不可)だよ!
GO TO FULL VERSION