C で文字列を検索する#

ヒント

この記事は、少なくとも 1 つのプログラミング言語を既に知っており、C# を学習している開発者向けの 基礎 セクションの一部です。 プログラミングを初めて使用する場合は、最初に「 はじめ に」チュートリアルから始めてください。

別の言語から来ていますか? C# string メソッド (ContainsStartsWithIndexOf 並列メソッドなど) は、Javaの String および JavaScript の String.prototype 内にあります。 主な違いは、一部の C# 検索では 、大文字と小文字が区別される序数 比較が既定で行われる点です。 それ以外の場合は、既定で現在のカルチャのセマンティクスが使用されます。 ユーザー向けの検索では、 StringComparison 値を渡すことができます。

String クラスには、2 つの日常的な質問に回答するメソッドが含まれています。

  • この文字列にはそのテキストが含まれていますか?ContainsStartsWith、または EndsWithを使用します。
  • そのテキストはどこで発生しますか?IndexOf または LastIndexOfを使用します。

正規表現を使用して、より複雑な検索アルゴリズムと置換アルゴリズムを構築できます。 正規表現とその他の文字列操作の詳細については、 文字列操作に関する言語リファレンス記事を参照してください。

文字列にテキストが含まれているかどうかを確認する

ContainsStartsWith、またはEndsWithを使用して、部分文字列の有無をテストします。

string factMessage = "Extension methods have all the capabilities of regular static methods.";

// Write the string and include the quotation marks.
Console.WriteLine($"\"{factMessage}\"");

// Default comparisons are case sensitive.
bool containsSearchResult = factMessage.Contains("extension");
Console.WriteLine($"""Contains "extension"? {containsSearchResult}""");

// For user-facing searches, pass a StringComparison value to control case and culture.
bool ignoreCaseSearchResult = factMessage.StartsWith("extension", StringComparison.CurrentCultureIgnoreCase);
Console.WriteLine($"""Starts with "extension"? {ignoreCaseSearchResult} (ignoring case)""");

bool endsWithSearchResult = factMessage.EndsWith(".", StringComparison.Ordinal);
Console.WriteLine($"Ends with '.'? {endsWithSearchResult}");
// => "Extension methods have all the capabilities of regular static methods."
// => Contains "extension"? False
// => Starts with "extension"? True (ignoring case)
// => Ends with '.'? True

これらのメソッドは、既定で大文字と小文字を区別する序数比較を使用します。 ユーザー入力を受け入れるため、または表示テキストで大文字と小文字を区別しないようにするには、StringComparison.CurrentCultureIgnoreCaseStringComparison.OrdinalIgnoreCase のような StringComparison 値を渡します。

1 文字を検索するときは、charContainsオーバーロードを使用します。 1 文字の文字列の割り当てを回避し、より直接的です。

string path = "/usr/local/bin";
bool hasSlash = path.Contains('/');
Console.WriteLine($"Path contains '/': {hasSlash}");
// => Path contains '/': True

テキストの位置を見つける

IndexOf は、部分文字列 (または文字) の最初の出現位置の 0 から始まるインデックスを返し、 LastIndexOf は最後の出現箇所のインデックスを返します。 両方とも、検索テキストが存在しない場合に -1 を返します。 それらを組み合わせて、2 つのマーカー間のテキストを抽出します。

string factMessage = "Extension methods have all the capabilities of regular static methods.";

Console.WriteLine($"\"{factMessage}\"");

// Extract the text between the first and last occurrence of "methods".
int first = factMessage.IndexOf("methods") + "methods".Length;
int last = factMessage.LastIndexOf("methods");
string between = factMessage.Substring(first, last - first);
Console.WriteLine($"""Substring between "methods" and "methods": '{between}'""");
// => "Extension methods have all the capabilities of regular static methods."
// => Substring between "methods" and "methods": ' have all the capabilities of regular static '

最初または最後ではなくすべての出現が必要な場合は、前の結果と 1 つを startIndex 引数として渡して反復処理するか、正規表現に切り替えます。

適切な比較を選択する

ほとんどの検索オーバーロードでは、省略可能な StringComparison 値を受け取ります。 検索するデータの種類に基づいて選択します。

  • 識別子、ファイル パス、プロトコル トークン、またはその他のコンピューター定義のものを検索する場合は、 Ordinalを使用します。
  • 同じ種類のコンピューター定義データを検索しているが、大文字と小文字の区別が必要な場合は、 OrdinalIgnoreCaseを使用します。
  • 現在のロケールのルールが適用されるユーザーに表示されるテキストを検索する場合は、 CurrentCultureを使用します。
  • その同じユーザー向け表示テキストを検索し、大文字と小文字を区別しない場合は、CurrentCultureIgnoreCaseを使用します。
  • すべてのコンピューターとカルチャで同じデータを比較する必要がある永続化されたデータを検索する場合は、 InvariantCulture を使用します (ほとんど必要ありません)。

序数比較は、最も高速なオプションであり、自然言語のテキストではないものに対する適切な既定値です。 カルチャに対応した比較は大幅に遅く、驚くべき結果を生み出す可能性があります。 たとえば、一部の文化では、小文字の i は大文字の I と対応しません。これは、ユーザーが自然文に対して実行する検索に限って使用してください。

カルチャに対応した比較の詳細な処理については、「文字列を 比較するためのベスト プラクティス」を参照してください。

こちらも参照ください