ここではStringクラスに用意されている機能のうち、文字列が他の文字列と一致するかどうかの判定や、部分文字列の位置を取得するなどといった文字列の探索と比較を行うためのメソッド等について見ていきます。
ここで解説する文字列の探索・比較の操作と、対応するStringクラスのメソッドを表にまとめます。 個々のメソッドの詳細については順に解説していきます。
文字列操作 | 対応するStringクラスのメソッド | 解説へのリンク |
---|---|---|
部分文字列の探索 (部分文字列の位置の取得) |
IndexOf (前方からの探索) LastIndexOf (後方からの探索) |
解説へ |
任意の一文字の探索 (文字の位置の取得) |
IndexOfAny (前方からの探索) LastIndexOfAny (後方からの探索) |
解説へ |
部分文字列を含むかどうかの判定 (部分一致の判定) |
Contains | 解説へ |
部分文字列で始まるかどうかの判定 (前方一致の判定) |
StartsWith | 解説へ |
部分文字列で終わるかどうかの判定 (後方一致の判定) |
EndsWith | 解説へ |
null または空の文字列かどうかの判定 |
IsNullOrEmpty | 解説へ |
null 、空の文字列、または空白のみかどうかの判定 |
IsNullOrWhiteSpace | 解説へ |
文字列が等しいかどうかの判定 | Equals | 解説へ |
等価演算子・不等価演算子 | 解説へ | |
文字列の大小関係の比較 | Compare, CompareTo | 解説へ |
序数による文字列の大小関係の比較 | CompareOrdinal | 解説へ |
文字列操作 | 対応するStringクラスのメソッド | 解説へのリンク |
上記以外のメソッドやここでは扱わない事項・関連する事項に関しては以下を参照してください。
- 文字列の連結や分割、部分文字列の切り出しなど、文字列の加工や編集については文字列の加工・編集を参照してください。
- 大文字小文字の違いなどの文字列の探索・比較時のオプション、カルチャの規則に基づいた比較・ロケール(カルチャ)によって動作が変わる場合とそれに依存しない方法など、文字と文字列の比較規則に関する詳細については文字列と比較オプション・カルチャの並べ替え規則を参照してください。
- Stringクラスでは正規表現などのパターンマッチングによる文字列操作は直接はサポートされません。 正規表現を使った文字列操作については正規表現によるパターンマッチングと文字列操作を参照してください。
- この文章ではUnicode正規形や正規化、サロゲートペアを含む文字列の扱いについては踏み込みません。 そういった要素を含む文字列の処理に関しては別途他のドキュメントを参照してください。
文字列の探索
ここでは文字列の探索などを行うためのメソッドについて見ていきます。
部分文字列の探索 (IndexOf, LastIndexOf)
String.IndexOfメソッドは文字列内にある部分文字列の位置を探索するメソッドで、文字列内にある部分文字列の最初のインデックスを返します。 文字列内に部分文字列がない場合は-1が返されます。
String.LastIndexOfメソッドは、IndexOfメソッドとは逆に後ろから探索を行い、文字列内にある部分文字列の最後のインデックスを返します。 文字列内に部分文字列がない場合はIndexOfメソッドと同様に-1が返されます。
IndexOfメソッド、LastIndexOfメソッドでは文字列ではなく文字(char)の位置を探索することも出来ます。 文字列内に指定された文字がない場合は同様に-1が返されます。
IndexOfメソッド、LastIndexOfメソッドでは、文字列比較時の動作をStringComparisonで指定することができます。 例えば、大文字小文字の違いを無視して部分文字列が一致するかどうかを調べることが出来ます。
文字列比較時のオプションStringComparisonについては文字列と比較オプション・カルチャの並べ替え規則 §.StringComparison列挙型とStringComparerクラスで詳しく説明しています。
任意の文字の探索 (IndexOfAny, LastIndexOfAny)
String.IndexOfAnyメソッドは指定された複数の文字の中で、文字列内で見つかった最初の位置を探索するメソッドです。 IndexOfメソッドと同様に、いずれの文字も見つからなかった場合は-1が返されます。
String.LastIndexOfAnyメソッドは、IndexOfAnyメソッドとは逆に後ろから探索を行い、文字列内で見つかった最後の位置を返します。
部分文字列の一致 (Contains, StartsWith, EndsWith)
String.Containsメソッドは文字列中に部分文字列が含まれているかどうかを調べるメソッドです。 部分文字列が含まれている場合(=IndexOfメソッドの結果が-1以外となる場合)はtrueが返されます。
String.StartsWithメソッドは文字列が指定された部分文字列で始まるかどうかを調べるメソッドです。 逆に、String.EndsWithメソッドは部分文字列で終わるかどうかを調べるメソッドです。
StartsWithメソッド・EndsWithメソッドでは、文字列比較時の動作をStringComparisonで指定することができます。 例えば、大文字小文字の違いを無視して部分文字列が一致するかどうかを調べることができます。
Containsメソッドも同様に、文字列比較時の動作をStringComparisonで指定することができます。 ただし、ContainsメソッドにStringComparisonを指定できるオーバーロードは、.NET Standard 2.1/.NET Core 2.1以降でのみ使用できます。
文字列比較時のオプションStringComparisonについては文字列と比較オプション・カルチャの並べ替え規則 §.StringComparison列挙型とStringComparerクラスで詳しく説明しています。
.NET Standard 2.1/.NET Core 2.0以降において、StartsWithおよびEndsWithメソッドは、IndexOf・LastIndexOfメソッドと同様にchar
を引数にとるバージョンが用意されているため、文字単位で一致を調べることができます。 Containsメソッドも同様に、.NET Standard 2.1/.NET Core 2.1以降でchar
を引数にとるバージョンが用意されています。
Contains・StartsWith・EndsWithの各メソッドでは、char
を引数にとるオーバーロードでも文字列比較時の動作をStringComparisonで指定することができます。 文字列比較時のオプションStringComparisonについては文字列と比較オプション・カルチャの並べ替え規則 §.StringComparison列挙型とStringComparerクラスで詳しく説明しています。
それ以外のバージョンでは、Contains・StartsWith・EndsWithの各メソッドにchar
を引数にとるバージョンが用意されていないので、文字単位での一致を調べることはできません。 文字列が指定された文字で始まる/終わる/含むかどうかを調べるには、IndexOf・LastIndexOfメソッドを使う必要があります。
次の例は、IndexOf・LastIndexOfメソッドを使って、char
を引数にとるContains・StartsWith・EndsWithメソッドを実装したものです。
文字列の比較・等価性の検証
ここでは文字列の比較・等価性の検証などを行うためのメソッドについて見ていきます。
null、空文字、空白のチェック (IsNullOrEmpty, IsNullOrWhiteSpace)
String.IsNullOrEmptyメソッドは文字列がnull
/Nothing
もしくは空文字かどうかをチェックする静的メソッドです。
String.IsNullOrWhiteSpaceメソッドは.NET Framework 4から追加されたメソッドで、文字列がnull
/Nothing
もしくは空文字か、空白文字のみで構成されているかどうかをチェックする静的メソッドです。
このメソッドでは、半角および全角のスペースやタブだけでなく、改行文字なども空白文字として扱われます。 具体的には、Unicodeで空白文字と定義されている文字(Char.IsWhiteSpaceがtrue
となる文字)が空白文字として扱われます。
なお、IsNullOrEmptyメソッド、IsNullOrWhiteSpaceメソッドの動作は、次のコードと等価です。
比較 (CompareTo, Equals, Compare)
String.CompareToメソッドとString.Equalsメソッドは文字列の比較を行うメソッドで、指定された文字列と比較した結果を返します。
CompareToメソッドの戻り値は、二つの文字列を並べ替えた時の順番に従い、次のようになります。 比較の際、null
/Nothing
は空文字を含むどのような文字列よりも小さいと判断され、null
/Nothing
同士は等価として扱われます。
文字列aとbの関係 | a.CompareTo(b)の戻り値 | 例 |
---|---|---|
並べ替えたときにaの方がbよりも前 (aはbよりも小さい) |
0より小さい値 | "ABC" < "ABD" null < "ABC" |
並べ替えたときにaとbは同じ位置 (aとbは等しい) |
0 | "ABC" = "ABC" null = null |
並べ替えたときにaの方がbよりも後 (aはbよりも大きい) |
0より大きい値 | "ABC" > "ABB" "ABC" > null |
Equalsメソッドは、二つの文字列が等しい場合(CompareToメソッドが0を返す場合)にTrueを返します。
String.Compareメソッドは、CompareToメソッドと同じ動作をする静的メソッドです。 Equalsメソッドは、静的メソッドとしても用意されています。 戻り値はインスタンスメソッドの場合と同じです。
文字列aとbの関係 | String.Compare(a, b)の戻り値 | 例 |
---|---|---|
並べ替えたときにaの方がbよりも前 (aはbよりも小さい) |
0より小さい値 | "ABC" < "ABD" null < "ABC" |
並べ替えたときにaとbは同じ位置 (aとbは等しい) |
0 | "ABC" = "ABC" null = null |
並べ替えたときにaの方がbよりも後 (aはbよりも大きい) |
0より大きい値 | "ABC" > "ABB" "ABC" > null |
インスタンスメソッドでも静的メソッドでも結果は同じですが、想定される状況により使い分けることが出来ます。 例えば、静的メソッドのCompareとEqualsを使うと、仮に文字列変数にnull
/Nothing
が代入されていてもヌル参照を引き起こさずに済みます。 (null
との比較や、null
同士の比較を行っても例外エラーにはなりません)
CompareToメソッド、Compareメソッド、Equalsメソッドでは、文字列比較時の動作をStringComparisonで指定することができます。 例えば、大文字小文字の違いを無視して文字列の比較を行うことができます。
文字列比較時のオプションStringComparisonについては文字列と比較オプション・カルチャの並べ替え規則 §.StringComparison列挙型とStringComparerクラスで詳しく説明しています。
序数による比較 (CompareOrdinal)
String.CompareOrdinalメソッドは、Compareメソッド同様に文字列の比較を行う静的メソッドですが、比較の際に文字列の各文字を数値(Unicode序数、Unicode ordinal)、つまり各文字のコードポイントでの比較を行う点で動作が異なります。
Compareメソッドでオプションを特に指定しない場合、現在のスレッドの(もしくは引数で指定された)カルチャの規則にしたがった比較を行うのに対し、CompareOrdinalメソッドでは常にカルチャに依存しない比較が行われます。
CompareメソッドとCompareOrdinalメソッドで大小関係が反転している箇所に注目してください。
CompareTo・Compare・Equalsの各メソッドでも、StringComparisonを指定することによってCompareOrdinalメソッドと同様の比較方法を使用するように指定できます。 これについては文字列と比較オプション・カルチャの並べ替え規則 §.StringComparison列挙型とStringComparerクラスで詳しく説明しています。
等価演算子(==, !=, <>)
C#、VB.NETでは等価演算子・不等価演算子を用いることで文字列同士の比較が行えます。 等価演算子の動作はEqualsメソッドと同等です。 つまりC#、VB.NETでのstring同士の等価演算子の結果は、String.Equals(a, b)と同じ動作となります。 不等価演算子は、その結果を否定(反転)したものとなります。
当然ながら、等価演算子・不等価演算子による比較の場合は、カルチャを無視したり大文字小文字を無視したりといった文字列比較時のオプション(StringComparison)を指定することはできません。 文字列比較時のオプションを指定する必要がある場合はEqualsメソッドを用います。
文字列の比較ではなく、文字列変数の参照の比較を行いたい場合、つまり2つの文字列変数が同一の文字列インスタンスを参照しているかどうかを調べるには、Object.ReferenceEqualsメソッドを使うことができます。 これについて詳しくは文字列とStringクラス §.参照と等価演算子で解説しています。
C#においては、等価演算子・不等価演算子がオーバーロードされていない限り、両辺がstringでないとコンパイルエラーとなります(タイプセーフ)。 一方、Equalsメソッドは引数にObject型をとるオーバーロードも用意されているため、stringと異なる型の比較を行おうとしてもコンパイルエラーにはなりません。
等価演算子とEqualsメソッドではパフォーマンスに若干の違いはありますが、どちらを使うのが妥当かは状況により異なるので、両者の違いを十分に考慮して選択する必要があります。
比較演算子 (<, <=, >, >=, Like)
(このドキュメントは未整理です)
VB.NETでは、不等号演算子、Like演算子を用いることでCompareメソッドと同等の比較が行えます。 比較時の動作は、Option Compareステートメントの設定により変わります。
C#では、不等号演算子による文字列の比較は行えないので、Compareメソッドを使用する必要があります。