文字列.Length / IndexOf()
| 対応: | C# 1.0(2002) |
|---|
文字列の長さを取得する『Length』プロパティと、指定した文字・文字列が最初に現れる位置を調べる『IndexOf()』メソッドです。
構文
// 文字列の長さ(文字数)を取得します。 文字列.Length // 指定した文字・文字列が最初に現れるインデックスを返します。見つからない場合は -1 を返します。 文字列.IndexOf(string value) 文字列.IndexOf(string value, int startIndex) // 指定した文字・文字列が最後に現れるインデックスを返します。見つからない場合は -1 を返します。 文字列.LastIndexOf(string value)
メソッド一覧
| メンバー | 概要 |
|---|---|
| Length | 文字列の文字数を整数で返します。空文字列の場合は 0 になります。 |
| IndexOf(string value) | 指定した文字列が最初に現れるインデックス(0始まり)を返します。見つからない場合は -1 を返します。 |
| IndexOf(string value, int startIndex) | startIndex の位置から検索を開始し、最初に現れるインデックスを返します。 |
| LastIndexOf(string value) | 指定した文字列が最後に現れるインデックスを返します。見つからない場合は -1 を返します。 |
サンプルコード
Program.cs
using System;
string greeting = "こんにちは、世界!";
// Length で文字数を取得する
Console.WriteLine(greeting.Length); // 9
// IndexOf() で文字の位置を調べる
int pos = greeting.IndexOf("世界");
Console.WriteLine(pos); // 6
// 見つからない場合は -1 が返る
int notFound = greeting.IndexOf("xyz");
Console.WriteLine(notFound); // -1
dotnet run 9 6 -1
startIndex と LastIndexOf() の使い方
『IndexOf()』に startIndex を指定すると、その位置から後ろを検索します。『LastIndexOf()』は最後の出現位置を返します。
SearchSample.cs
using System;
// startIndex を指定して途中から検索する
string path = "C:/users/akiba/documents/akiba.txt";
int first = path.IndexOf("akiba");
int next = path.IndexOf("akiba", first + 1);
Console.WriteLine(first); // 9
Console.WriteLine(next); // 25
// LastIndexOf() で最後の出現位置を取得する
string text = "あいうあいうあいう";
Console.WriteLine(text.LastIndexOf("あ")); // 6
// 大文字・小文字を区別しない検索
string msg = "Hello, C# World!";
int idx = msg.IndexOf("hello", StringComparison.OrdinalIgnoreCase);
Console.WriteLine(idx); // 0
dotnet run 9 25 6 0
実践パターン: メールアドレスの分割
IndexOf() と Substring() を組み合わせてメールアドレスをユーザー名とドメインに分割する例です。
EmailParse.cs
using System;
string email = "okabe@wp-p.info";
int atIndex = email.IndexOf("@");
if (atIndex >= 0) {
string user = email.Substring(0, atIndex);
string domain = email.Substring(atIndex + 1);
Console.WriteLine($"ユーザー: {user}"); // ユーザー: okabe
Console.WriteLine($"ドメイン: {domain}"); // ドメイン: wp-p.info
} else {
Console.WriteLine("不正なメールアドレスです。");
}
dotnet run ユーザー: okabe ドメイン: wp-p.info
よくあるミス
よくあるミス: IndexOf() の戻り値を確認しないで Substring() を呼ぶ
『IndexOf()』が -1 を返した(見つからなかった)場合、そのまま Substring() に渡すと ArgumentOutOfRangeException が発生します。
using System;
// NG: IndexOf() が -1 を返したとき Substring() を呼ぶと例外が発生する
string text = "Hello, World!";
int pos = text.IndexOf("C#"); // -1 が返る
string part = text.Substring(pos); // ArgumentOutOfRangeException
dotnet run Unhandled exception. System.ArgumentOutOfRangeException: StartIndex cannot be less than zero.
修正後は次の通りです。
using System;
// OK: -1 チェックを必ず行う
string text = "Hello, World!";
int pos = text.IndexOf("C#");
if (pos >= 0) {
string part = text.Substring(pos);
Console.WriteLine(part);
} else {
Console.WriteLine("見つかりませんでした。");
}
dotnet run 見つかりませんでした。
概要
『Length』は文字列が持つプロパティ(メソッドではない)で、呼び出し時に括弧は不要です。C# の文字列はインデックスが 0 始まりで、日本語の全角文字も 1 文字としてカウントされます。
『IndexOf()』は大文字・小文字を区別します。区別せずに検索したい場合は IndexOf(value, StringComparison.OrdinalIgnoreCase) を使用してください。
文字列の切り出しには『Substring() / Remove()』、文字の置換や含有チェックには『Replace() / Contains()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。