文字列の検索とは|C#の文字列検索に使うメソッド6種などいくつか紹介します

文字列の検索とは|C#の文字列検索に使うメソッド6種などいくつか紹介します

C#エンジニア 案件・求人一覧はこちら

文字列の検索とは


文字列の検索とは、検索エンジンのように指定したキーワードを含む文字列を検索できる機能です。

C#では、IndexOfメソッドを基本として、ContainsメソッドやStartsWithメソッド、EndsWithメソッドを文字列検索に使用できます。

ここからは、C#の文字列検索ができる6種類のメソッドのほか、細かな検索条件を設定する場合のやり方について紹介していきます。

C#の文字列検索に使うメソッド6種


C#の文字列探索に使うメソッド6種の使い方についてお話しします。

C#で文字列探索するメソッドは主にIndexOfメソッドとContainsメソッド、StartsWithメソッド、EndsWithメソッドがありますが、それぞれ異なる条件で検索できるようになっています。

IndexOfメソッドは、指定した文字列が含まれていた場合、その文字列のインデックス(場所)を返しますが、Containsメソッドと他2つのメソッドは、指定した文字列が含まれているかどうかを判定します。

使用するメソッドによっては、逆方向に文字検索したり、複数文字を検索することもできます。目的に合ったメソッドを選ぶようにしましょう。

1:String.IndexOfで基本検索

C#の文字列検索でいちばん使いやすく機能が多いメソッドはString.IndexOfでしょう。このメソッドは検索対象の文字列に、指定した文字列が0から数えて何文字目にあるかを返します。指定した文字列が無い場合は-1を返します。以下はその簡単な使用例です。

string str = “これは文字列検索のテストです。”;

Console.WriteLine(str.IndexOf(“テスト”));
Console.WriteLine(str.IndexOf(“てすと”));
Console.WriteLine(str.IndexOf(“これ”));

手軽に使えるString.IndexOf

上の例を実行すると以下のような結果になります。

9
-1
0

“テスト”は0から数えて9文字目、”てすと”は平仮名なので一致せず-1、”これ”は先頭なので0になります。

なおString.IndexOfは検索開始位置を指定することができます。以下がその例です。

string str = “テストです、テストなのです。”;
Console.WriteLine(str.IndexOf(“テスト”, 1));

結果は6になります。0から数えて1文字目から検索するので、検索対象が”ストです、テストなのです。”となって6文字目になります。

2:String.LastIndexOfで末尾から検索

String.LastIndexOfはIndexOfとは違い、文字列の先頭方向からではなく末尾方向から検索します。以下が使用例です。

string str = “テストです、テストなのです。”;

Console.WriteLine(str.LastIndexOf(“テスト”));
Console.WriteLine(str.LastIndexOf(“テスト”,8));
Console.WriteLine(str.LastIndexOf(“テスト”,7));

結果は以下になります。

6
6
0

1つ目のLastIndexOfは末尾から先頭方向に向かって検索して6文字目で”テスト”を検出しています。2つ目は8文字目から検索してすぐに”テスト”を検出したので1つ目と同じ結果です。しかし3つ目は7文字目からのため、”テストです、テス”の末尾から検索し始めるので、0文字目の結果を返すのです。

3:String.IndexOfAnyで複数文字を検索

String.IndexOfAnyは文字列に指定したchar配列のどれかが含まれていた場合、その位置を返します。以下が使用例です。

string str = “これは文字列検索の\nテストです。”;
char[] c_ary = { ‘\n’, ‘\t’, ‘ ‘ };

Console.WriteLine(str.IndexOfAny(c_ary));

結果は\nの位置の9を返します。使い道が限られそうですが、このサンプルのように文字列に改行コードやタブ、半角スペース等が入っているかどうかを検出する時には便利でしょう。

4:Containsで含まれているか判定

Containsメソッドは、指定した文字列が検索対象の文字列に含まれている場合はtrueを返し、含まれていない場合はfalseを返すメソッドです。以下が使用例です。

string str = “これは文字列検索のテストです。”;
string keyword = “テスト”;

if(str.Contains(keyword)) {
Console.WriteLine(“指定した文字列が含まれています。”);
} else {
Console.WriteLine(“指定した文字列がありません。”);
}

結果はtrueが返されるため、「指定した文字列が含まれています」と出力されます。

5:StartsWithで先頭一致を判定

StartsWithメソッドは、指定した文字列が検索対象の文字列を検索し、先頭が一致した場合にはtrueを返し、一致しなかった場合にはfalseを返すメソッドです。

指定した文字列が前から一致するかを判定するメソッドですので、途中で一致しても一致した判定にはならないことに注意してください。以下が使用例です。

string str = “これは文字列検索のテストです。”;

if(str.StartsWith(“テスト”)) {
Console.WriteLine(“前方一致しています”);
} else {
Console.WriteLine(“前方一致していません”);
}

結果はfalseが返されるため、「前方一致していません」と出力されます。

6:EndsWithで末尾一致を判定

EndsWithメソッドは、指定した文字列が検索対象の文字列を検索し、後方が一致した場合にはtrueを返し、一致しなかった場合にはfalseを返すメソッドです。

StartsWithとは逆に、指定した文字列が後ろから一致するかを判定するメソッドです。以下が使用例です。

string str = “これは文字列検索のテストです。”;

if(str.EndsWith(“です。”)) {
Console.WriteLine(“後方一致しています”);
} else {
Console.WriteLine(“後方一致していません”);
}

結果はtrueが返されるため、「後方一致しています」と出力されます。

C#で複雑な文字列検索をする際に役立つ方法4選


ここまではC#で文字列検索に使用するメソッドを紹介しましたが、ここからはC#で複雑な文字列検索をする際に役立つ方法について紹介していきます。

指定した文字列が完全一致するか、というだけでは使いにくいことも多いです。これから紹介する方法を使えば、紹介したC#のメソッドと合わせて、大文字小文字の区別やかな、全角半角の区別、濁音などを無視して検索できるようになり、検索条件の幅を広げられます。

さらに正規表現を組み合わせられれば、ワイルドカードを使用できるなど、詳細な検索条件を設定できるようになりますので、C#の文字列検索と合わせて学習してみましょう。

1:大文字と小文字の区別をせずに検索する

文字列検索では大文字と小文字の区別をせずに検索したい時もあるでしょう。そのやり方は以下の通りです。

string str = “半角大文字のTEST、全角小文字のtest”;

Console.WriteLine(str.IndexOf(“test”, StringComparison.OrdinalIgnoreCase));
Console.WriteLine(str.IndexOf(“TEST”, StringComparison.OrdinalIgnoreCase));

これを実行すると以下のように表示されます。

6
17

IndexOfの第二引数にStringComparison.OrdinalIgnoreCaseを指定すれば、半角でも全角でも大文字小文字を無視した検索ができます。

2:かなとカナ、全角と半角の区別をせずに検索する

日本語の文字列の検索では、かなとカナの違いや全角・半角の違いを無視した検索をしたい時があるでしょう。C#ではCompareInfoを使えば可能です。以下が例になります。

string str = “平仮名のてすと、全角のテスト”;

System.Globalization.CompareInfo coinfo = System.Globalization.CultureInfo.CurrentCulture.CompareInfo;

Console.WriteLine(coinfo.IndexOf(str, “テスト”, System.Globalization.CompareOptions.IgnoreKanaType));
Console.WriteLine(coinfo.IndexOf(str, “テスト”, System.Globalization.CompareOptions.IgnoreWidth));

かなとカナの違いを無視したい場合はIgnoreKanaTypeを、全角と半角の違いを無視したい場合はIgnoreWidthを指定します。結果は、以下になります。

4
11

3:濁音無視、記号無視で検索する

CompareInfoを使うと、以下のような非常に変わった検索をすることもできます。

string str = “綺麗なガーベラ、かわいいチ?ュー!リ。ッ、プ”;

System.Globalization.CompareInfo coinfo = System.Globalization.CultureInfo.CurrentCulture.CompareInfo;

Console.WriteLine(coinfo.IndexOf(str, “カーヘラ”, System.Globalization.CompareOptions.IgnoreNonSpace));
Console.WriteLine(coinfo.IndexOf(str, “チューリップ”, System.Globalization.CompareOptions.IgnoreSymbols));

IgnoreNonSpaceを指定すると濁点を無視できます。IgnoreSymbolsを指定すると記号が無視されます。結果は以下になります。

3
12

この機能を使う機会はなかなか無いと思いますが、頭の片隅に置いておくといつか役に立つかもしれません。

4:正規表現を使って検索する

C#は正規表現を使った高度な文字列検索も可能です。例えば以下のようなことができます。なおこれを実行する場合はソースの先頭に”using System.Text.RegularExpressions;”を追加してください。

string str = “30歳の誕生日を迎えました!”;
Console.WriteLine(Regex.IsMatch(str, “^[0-9][0-9].+誕生日|節目.+!$”));

Regex.IsMatchの指定は「先頭が2桁の数字で、その後に1文字以上の文字列が続き、その後に”誕生日”か”節目”という言葉があって、その後に1文字以上の文字列が続き、最後が”!”で終わる」という意味です。

これを実行するとTrueが表示されます。正規表現はとても奥が深く、マスターすれば非常に高度な文字列の検索ができるようになります。文字列検索を極めたい人は是非チャレンジしてみてください。

C#の文字列検索を使いこなし転職に活かしましょう


この記事では、C#の文字列検索について説明しました。

C#は、Webアプリ開発やゲーム開発等でよく使用される言語で、これからもC#エンジニアの需要は続くとみられています。

文字列検索をはじめ、C#の基礎的なメソッドを使いこなして転職活動に活かしていきましょう。

C#エンジニア 案件・求人一覧はこちら

インフラエンジニア専門の転職サイト「FEnetインフラ」

FEnetインフラはサービス開始から10年以上『エンジニアの生涯価値の向上』をミッションに掲げ、多くのエンジニアの就業を支援してきました。

転職をお考えの方は気軽にご登録・ご相談ください。

合わせて読みたい

C#におけるSleep処理とは? hbspt.cta.load(20723875, 'd567c97b-58b2-483a-83fe-aec2e001739a', {"useNewLoader":"true","region":"na1"}); C#におけるSleep処理とは? Thread.Sleepメソッド C#の...
C#のswitch文を解説!if文との違いやさまざまな使い方を紹介... hbspt.cta.load(20723875, 'd567c97b-58b2-483a-83fe-aec2e001739a', {"useNewLoader":"true","region":"na1"}); C#のswitch文とは? まずはswitch文を使ってみよう C#にはs...
C#のdelegateでできることは?便利な使い方やラムダ式についても紹介... hbspt.cta.load(20723875, 'd567c97b-58b2-483a-83fe-aec2e001739a', {"useNewLoader":"true","region":"na1"}); C#のdelegateとは? C#にはdelegateという文法があります。...
【組み込み】C#からPythonを呼び出す方法を紹介... hbspt.cta.load(20723875, '4d5ed975-c4a9-41ec-8e28-71f1d092cb5c', {"useNewLoader":"true","region":"na1"}); 組み込みとは? 一般に、特定の機能を家電製品や機械などに埋め込んで利用すること...
C#のLINQにチャレンジしてみよう! hbspt.cta.load(20723875, 'd567c97b-58b2-483a-83fe-aec2e001739a', {"useNewLoader":"true","region":"na1"}); C#のLINQとは? C#のLINQとはLanguage-Integrated ...