方法: 文字列を検索するHow to: search strings

2 つの主な戦略を使用して、文字列のテキストを検索することができます。You can use two main strategies to search for text in strings. String クラスのメソッドは特定のテキストを検索します。Methods of the String class search for specific text. 正規表現はテキストのパターンを検索します。Regular expressions search for patterns in text.

注意

この記事の C# 例は、Try.NET インライン コード ランナーとプレイグラウンドで実行されます。The C# examples in this article run in the Try.NET inline code runner and playground. [実行] ボタンを選択すると、対話型ウィンドウで例が実行されます。Select the Run button to run an example in an interactive window. コードを実行したら、コードを変更し、 [実行] をもう一度選択して変更後のコードを実行できます。Once you execute the code, you can modify it and run the modified code by selecting Run again. 変更後のコードが対話型ウィンドウで実行されるか、コンパイルできなかった場合、対話型ウィンドウにすべての C# コンパイラ エラー メッセージが表示されます。The modified code either runs in the interactive window or, if compilation fails, the interactive window displays all C# compiler error messages.

string 型は、System.String クラスのエイリアスであり、文字列の内容を検索するための多数の便利なメソッドを提供します。The string type, which is an alias for the System.String class, provides a number of useful methods for searching the contents of a string. その中に ContainsStartsWithEndsWithIndexOfLastIndexOf が含まれています。Among them are Contains, StartsWith, EndsWith, IndexOf, LastIndexOf. System.Text.RegularExpressions.Regex クラスでは、テキストのパターンを検索するための豊富なボキャブラリが提供されます。The System.Text.RegularExpressions.Regex class provides a rich vocabulary to search for patterns in text. この記事では、これらの手法と、ニーズに最適なメソッドを選択する方法について説明します。In this article, you learn these techniques and how to choose the best method for your needs.

文字列にテキストが含まれていますか?Does a string contain text?

String.ContainsString.StartsWith および String.EndsWithメソッドでは、特定のテキストの文字列を検索します。The String.Contains, String.StartsWith and String.EndsWith methods search a string for specific text. 次の例は、これらの各メソッドと、大文字と小文字を区別しない検索を使用するバリエーションを示しています。The following example shows each of these methods and a variation that uses a case insensitive search:

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

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

// Simple comparisons are always case sensitive!
bool containsSearchResult = factMessage.Contains("extension");
Console.WriteLine($"Starts with \"extension\"? {containsSearchResult}");

// For user input and strings that will be displayed to the end user, 
// use the StringComparison parameter on methods that have it to specify how to match strings.
bool ignoreCaseSearchResult = factMessage.StartsWith("extension", System.StringComparison.CurrentCultureIgnoreCase);
Console.WriteLine($"Starts with \"extension\"? {ignoreCaseSearchResult} (ignoring case)");

bool endsWithSearchResult = factMessage.EndsWith(".", System.StringComparison.CurrentCultureIgnoreCase);
Console.WriteLine($"Ends with '.'? {endsWithSearchResult}");

上の例は、これらのメソッドを使用する重要なポイントを示しています。The preceding example demonstrates an important point for using these methods. 既定では、検索で大文字と小文字が区別されます。Searches are case-sensitive by default. 大文字と小文字を区別しない検索を指定する場合は、StringComparison.CurrentCultureIgnoreCase 列挙値を使用します。You use the StringComparison.CurrentCultureIgnoreCase enum value to specify a case insensitive search.

検索対象テキストは文字列のどこにありますか?Where does the sought text occur in a string?

IndexOf および LastIndexOf メソッドでは、文字列のテキストも検索します。The IndexOf and LastIndexOf methods also search for text in strings. これらのメソッドは、検索されるテキストの場所を返します。These methods return the location of the text being sought. テキストが見つからない場合は、-1 が返されます。If the text isn't found, they return -1. 次の例では、"methods" という単語の最初と最後の出現箇所の検索を示し、その間のテキストを表示します。The following example shows a search for the first and last occurrence of the word "methods" and displays the text in between.

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

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

// This search returns the substring between two strings, so 
// the first index is moved to the character just after the first string.
int first = factMessage.IndexOf("methods") + "methods".Length;
int last = factMessage.LastIndexOf("methods");
string str2 = factMessage.Substring(first, last - first);
Console.WriteLine($"Substring between \"methods\" and \"methods\": '{str2}'");

正規表現を使用する特定のテキストの検索Finding specific text using regular expressions

文字列の検索には、System.Text.RegularExpressions.Regex クラスを使用できます。The System.Text.RegularExpressions.Regex class can be used to search strings. これらの検索の複雑さは、単純なテキスト パターンから複雑なテキスト パターンまでさまざまです。These searches can range in complexity from simple to complicated text patterns.

次のコード例では、文章内の "the" または "their" という単語を検索します (大文字と小文字の区別は無視されます)。The following code example searches for the word "the" or "their" in a sentence, ignoring case. 静的メソッドの Regex.IsMatch で検索を実行します。The static method Regex.IsMatch performs the search. 検索対象の文字列と、検索パターンを指定します。You give it the string to search and a search pattern. この例では、3 番目の引数で大文字と小文字を区別しない検索を指定します。In this case, a third argument specifies case-insensitive search. 詳細については、「System.Text.RegularExpressions.RegexOptions」を参照してください。For more information, see System.Text.RegularExpressions.RegexOptions.

検索パターンで検索対象のテキストを説明します。The search pattern describes the text you search for. 次の表では、検索パターンの各要素について説明します The following table describes each element of the search pattern. (以下の表では、C# 文字列で \\ としてエスケープされる必要がある、単一の \ を使用します)。(The table below uses the single \ which must be escaped as \\ in a C# string).

patternpattern 説明Meaning
thethe テキスト "the" と一致match the text "the"
(eir)?(eir)? "eir" の 0 個または 1 個の出現箇所と一致match 0 or 1 occurrence of "eir"
\s\s 空白文字と一致match a white-space character
string[] sentences =
{
    "Put the water over there.",
    "They're quite thirsty.",
    "Their water bottles broke."
};

string sPattern = "the(ir)?\\s";

foreach (string s in sentences)
{
    Console.Write($"{s,24}");

    if (System.Text.RegularExpressions.Regex.IsMatch(s, sPattern, System.Text.RegularExpressions.RegexOptions.IgnoreCase))
    {
        Console.WriteLine($"  (match for '{sPattern}' found)");
    }
    else
    {
        Console.WriteLine();
    }
}

ヒント

string メソッドは、通常、正確な文字列を検索するときに選択することをお勧めします。The string methods are usually better choices when you are searching for an exact string. 正規表現は、ソース文字列でいくつかのパターンを検索する場合に適しています。Regular expressions are better when you are searching for some pattern is a source string.

文字列はパターンに従っていますか?Does a string follow a pattern?

次のコードでは正規表現を使用して、配列の各文字列の形式を検証します。The following code uses regular expressions to validate the format of each string in an array. 各文字列が電話番号の形式であることが検証されます。つまり、3 グループの数値がダッシュで区切られ、最初の 2 グループには 3 桁の数値が含まれ、3 つ目のグループには 4 桁の数値が含まれることが検証されます。The validation requires that each string have the form of a telephone number in which three groups of digits are separated by dashes, the first two groups contain three digits, and the third group contains four digits. 検索パターンでは正規表現の ^\\d{3}-\\d{3}-\\d{4}$ を使用します。The search pattern uses the regular expression ^\\d{3}-\\d{3}-\\d{4}$. 詳細については、「正規表現言語 - クイック リファレンス」をご覧ください。For more information, see Regular Expression Language - Quick Reference.

patternpattern 説明Meaning
^ 文字列の先頭と一致matches the beginning of the string
\d{3}\d{3} 3 桁の文字と完全に一致matches exactly 3 digit characters
- '-' 文字と一致matches the '-' character
\d{3}\d{3} 3 桁の文字と完全に一致matches exactly 3 digit characters
- '-' 文字と一致matches the '-' character
\d{4}\d{4} 4 桁の文字と完全に一致matches exactly 4 digit characters
$ 文字列の末尾と一致matches the end of the string
string[] numbers =
{
    "123-555-0190",
    "444-234-22450",
    "690-555-0178",
    "146-893-232",
    "146-555-0122",
    "4007-555-0111",
    "407-555-0111",
    "407-2-5555",
    "407-555-8974",
    "407-2ab-5555",
    "690-555-8148",
    "146-893-232-"
};

string sPattern = "^\\d{3}-\\d{3}-\\d{4}$";

foreach (string s in numbers)
{
    Console.Write($"{s,14}");

    if (System.Text.RegularExpressions.Regex.IsMatch(s, sPattern))
    {
        Console.WriteLine(" - valid");
    }
    else
    {
        Console.WriteLine(" - invalid");
    }
}

この単一の検索パターンは多くの有効な文字列と一致します。This single search pattern matches many valid strings. 単一のテキスト文字列ではなく、パターンの検索やパターンに対する検証を行う場合は、正規表現が適しています。Regular expressions are better to search for or validate against a pattern, rather than a single text string.

GitHub リポジトリのコードを見て、これらのサンプルを試すことができます。You can try these samples by looking at the code in our GitHub repository. または、サンプルを zip ファイルとしてダウンロードすることができます。Or you can download the samples as a zip file.

関連項目See also