ここではStringクラスに用意されている機能のうち、文字列から一部分を取得したり、置換するなどといった文字列の加工と編集を行うためのメソッド等について見ていきます。
ここで解説する文字列の加工・編集の操作と、対応するStringクラスのメソッドを表にまとめます。 個々のメソッドの詳細については順に解説していきます。
文字列操作 | 対応するStringクラスのメソッド | 解説へのリンク |
---|---|---|
文字列同士の連結 | Concat、+演算子、+=演算子 | 解説へ |
文字列の複製 | Copy | 解説へ |
文字列からの一部分の取得 (部分文字列の切り出し) |
Substring | 解説へ |
文字列への挿入 | Insert | 解説へ |
文字列の一部分の削除 | Remove | 解説へ |
文字列の一部分の置換 | Replace | 解説へ |
単一文字列から文字列配列への分割 (任意の区切り文字での分割) |
Split | 解説へ |
文字列配列から単一文字列への結合 (任意の区切り文字での結合) |
Join | 解説へ |
文字列前後の余白の削除 | Trim, TrimEnd, TrimStart | 解説へ |
文字列前後への余白の挿入 | PadLeft, PadRight | 解説へ |
文字列の大文字化・小文字化 | ToUpper, ToLower, ToUpperInvariant, ToLowerInvariant | 解説へ |
書式化 (数値などの値の文字列化) |
Format | 解説へ |
単一文字列からChar配列への変換 | ToCharArray, CopyTo | 解説へ |
Char配列から単一文字列への変換 | Stringコンストラクタ | 解説へ |
文字列操作 | 対応するStringクラスのメソッド | 解説へのリンク |
上記以外のメソッドやここでは扱わない事項・関連する事項に関しては以下を参照してください。
- 部分文字列の検索や文字列同士の比較など、文字列の探索や比較については文字列の探索・比較を参照してください。
- 大文字小文字の違いなどの文字列の探索・比較時のオプション、カルチャの規則に基づいた比較・ロケール(カルチャ)によって動作が変わる場合とそれに依存しない方法など、文字と文字列の比較規則に関する詳細については文字列と比較オプション・カルチャの並べ替え規則を参照してください。
- Stringクラスでは正規表現などのパターンマッチングによる文字列操作は直接はサポートされません。 正規表現を使った文字列操作については正規表現によるパターンマッチングと文字列操作を参照してください。
- この文章ではUnicode正規形や正規化、サロゲートペアを含む文字列の扱いについては踏み込みません。 そういった要素を含む文字列の処理に関しては別途他のドキュメントを参照してください。
文字列の加工・編集
連結 (Concat, +, +=)
String.Concatメソッドは文字列同士の連結を行う静的メソッドで、任意の数の文字列を連結出来ます。 またC#、VBでは加算演算子+
、および複合代入の加算演算子+=
を使った連結もできるようになっています。
.NET Framework 4からは、IEnumerable<String>
を引数にとるバージョンのConcatも用意されています。 これを利用するとListに格納されている複数の文字列を一つに連結するということがメソッド呼び出し一つで行えます。
複製 (Copy)
String.Copyメソッドは文字列の複製を行う静的メソッドです。 見かけ上の動作は文字列変数の単なる代入と似ていますが、Copyメソッドでは指定された文字列と同じ内容の新しいインスタンスが作成される点が異なります。
代入と複製の違い、参照の比較についてはオブジェクトの複製や値型と参照型 §.同値性・同一性の比較などを参照してください。
切り出し (Substring)
String.Substringメソッドは文字列から部分文字列を切り出すメソッドで、切り出す最初のインデックスと長さを指定することで文字列の一部分を取得します。 長さを指定しなかった場合は、指定されたインデックスから文字列の最後までが返されます。
挿入 (Insert)
String.Insertメソッドは文字列に別の文字列を挿入するメソッドです。 Insertメソッドは別の文字列を挿入した結果を返します。
このメソッドでは、元の文字列には変更を加えず、挿入した結果を新しい文字列として返します。
削除 (Remove)
String.Removeメソッドは文字列の一部分を削除した文字列を取得するメソッドで、削除を始める最初のインデックスと長さを指定することで文字列の一部分を削除します。 長さを指定しなかった場合は、指定されたインデックスから文字列の最後までが削除されます。
このメソッドでは、元の文字列には変更を加えず、削除した結果を新しい文字列として返します。
位置を指定した削除ではなく、部分文字列を指定した削除(特定の文字列の削除)にはReplaceメソッドを使用します。
置換 (Replace)
String.Replaceメソッドは文字列内の部分文字列を別の部分文字列に置き換えるメソッドです。 一致する文字列はすべて置き換えられます。
このメソッドでは、元の文字列には変更を加えず、置換した結果を新しい文字列として返します。
最初に一致する箇所だけ置換したい場合など、一括置換以外に条件を加えたいといった場合には、正規表現を使うことができます。 具体例についてはRegex.MatchメソッドやMatch.Resultメソッドを使った例を参照してください。
String.Replaceメソッドメソッドでは、置き換え後の文字列としてnull
/Nothing
もしくは空文字(String.Empty)を指定すると、置き換え前の部分文字列を削除することが出来ます。
また、Replaceメソッドでは文字(Char)単位での置換も行えます。
分割 (Split)
String.Splitメソッドは文字列の分割を行うメソッドで、区切りとなる文字(char
/Char
)または文字列を指定し、それを区切りとして分割した結果を文字列の配列で返します。
String.Splitメソッドでは、区切りとなる文字または文字列を複数指定することもできます。 この場合、どれか一つに一致する箇所があれば、そこを区切りとして分割が行われます。
String.Splitメソッドでは、分割時の動作オプションをStringSplitOptionsで指定することができます。
StringSplitOptionsでは、分割によって生じる空の要素を除外するRemoveEmptyEntries、分割によって生じる前後の空白を削除するTrimEntriesを指定することができます。 特に指定しない場合、StringSplitOptions.Noneを指定した場合は、デフォルトの動作となります。
正規表現を用いて分割を行いたい場合は、Regex.Splitメソッドを使用します。
空の要素の除外 (StringSplitOptions.RemoveEmptyEntries)
String.SplitメソッドでStringSplitOptions.RemoveEmptyEntriesを指定すると、分割によって空の要素(長さ0の部分)が生じた場合に、それを除外することができます。
前後の空白の削除 (StringSplitOptions.TrimEntries)
String.SplitメソッドでStringSplitOptions.TrimEntriesを指定すると、分割によって各要素の前後に空白が生じる場合に、それを削除することができます。 これは、Splitメソッドで分割した後に個々の要素に対してString.Trimメソッドを呼び出し、前後の空白を削除するのと同じ動作となります。
StringSplitOptions.TrimEntriesは.NET 5以降で使用できます。
なお、このオプションではString.Trimメソッドと同様にChar.IsWhiteSpaceがtrueとなる空白文字が削除されます。 空白文字には改行文字等も含まれます。
結合 (Join)
String.Joinメソッドは配列の結合を行う静的メソッドで、結合時の区切り文字と配列を指定し、それらを結合した結果を返します。 区切り文字には空の文字列を指定することもできます。 (結果はString.Concatメソッドによる連結と同じになります)
.NET Framework 4からは、IEnumerable<String>
を引数にとるバージョンのString.Joinメソッドも用意されています。 これを利用するとListに格納されている複数の文字列を一つに結合するということがメソッド呼び出し一つで行えます。
余白の削除 (Trim, TrimEnd, TrimStart)
String.Trimメソッドは文字列の先頭と末尾にある空白文字を削除(トリミング)するメソッドです。 String.TrimStartメソッドでは先頭のみ、String.TrimEndメソッドでは末尾のみにある空白文字を削除します。
このメソッドでは、半角および全角のスペースやタブだけでなく、改行文字なども空白文字として扱われます。 .NET Framework 4以降では、Unicodeで空白文字と定義されている文字(Char.IsWhiteSpaceがtrueとなる文字)が空白文字として扱われます。 それ以前のバージョンでの空白文字の扱いなど詳細は.NET Frameworkのドキュメントを参照してください。
String.Trim・TrimStart・TrimEndの各メソッドは、削除する文字を明示的に指定することも出来ます。 半角空白だけ削除したいといった場合や、スペースや改行文字以外の文字を削除したい場合には、それらの削除したい文字を明示的に指定します。
複雑な文字種を削除対象として指定する場合は、正規表現のほうが適切な可能性があります。 正規表現を用いて削除する場合は文字列の先頭・末尾を表す正規表現要素とRegex.Replaceメソッドを使って空の文字列に置き換えることで削除できます。
余白の挿入 (PadLeft, PadRight)
String.PadLeftメソッドは余白の挿入を行うメソッドで、指定された文字数になるように左側にスペースを挿入します。 String.PadRightメソッドはPadLeftメソッドとは逆に右側にスペースを挿入します。 指定された文字数より文字列の長さの方が大きい場合、スペースは挿入されません。 このメソッドを使うことで文字列を左寄せ・右寄せすることができます。
余白の挿入はあくまで文字数を基準に行われます。 文字種が全角か半角かといった考慮はされないため、「全角または半角n文字分となるよう余白を入れる」といった目的でこのメソッドを使うことはできません。
中寄せ(センタリング)を行うように余白を挿入するメソッドは用意されていないので、そういった場合には独自に実装する必要があります。 実装例は§.センタリングを参照してください。
String.PadLeft・PadRightメソッドでは、余白として半角スペース以外の文字を挿入するように指定することも出来ます。
大文字化・小文字化 (ToUpper, ToLower, ToUpperInvariant, ToLowerInvariant)
String.ToUpperメソッドは文字列を大文字化するメソッド、String.ToLowerメソッドは文字列を小文字化するメソッドです。
ToUpperメソッドとToLowerメソッドは現在のスレッドの(もしくは引数で指定された)カルチャの規則に基づいて大文字化・小文字化しますが、String.ToUpperInvariantメソッドとString.ToLowerInvariantメソッドはインバリアントカルチャ(特定の文化圏や言語に依存しない)の規則に基づいて大文字化・小文字化します。
ToUpper
/ToUpperInvariant
とToLower
/ToLowerInvariant
の違いは、大文字化・小文字化の際に参照される規則です。
例えば、トルコ語においては i の大文字は I(U+0049) ではなく İ(U+0131) で、I の小文字は i(U+0069) ではなく ı(U+0130) となるため、スレッドのカルチャがトルコ語の場合ToUpper
/ToLower
の結果はToUpperInvariant
/ToLowerInvariant
と異なる結果となります。
したがって、カルチャや変換規則を強く意識する必要がある場合はToUpper
/ToLower
を用いる必要があります。 一方それ以外の多くの場合はToUpperInvariant
/ToLowerInvariant
で十分と言えます。 特に、単にASCIIの範囲の文字だけを大文字/小文字にしたいという目的であれば、カルチャと変換規則に影響されないToUpperInvariant/ToLowerInvariantのほうが適切かつパフォーマンス的にも優れると考えられます。
カルチャと変換規則については、カルチャによる動作の違いとインバリアントカルチャ §.文字列比較の規則・ソート順定義(CompareInfo)としてのCurrentCultureやStringComparisonとStringComparerでも詳しく説明しています。 ToUpper/ToLowerメソッド以外でカルチャによって異なる動作となる場合については、カルチャによる動作の違いとインバリアントカルチャを参照してください。
書式化 (Format)
String.Formatメソッドは任意の引数を指定された書式に基づいて文字列化する静的メソッドです。
書式の詳細については書式指定子での解説を参照してください。
Char配列への変換 (ToCharArray, CopyTo)
String.ToCharArrayメソッドは文字列をChar配列へ変換するメソッドです。
バイト配列への変換、特に文字コードを指定してバイト配列へ変換する方法についてはテキスト変換・フォーマット変換 §.文字コードあるいはバイト列操作 §.文字列とバイト列の相互変換 (Encoding)を参照してください。
String.CopyToメソッドは、文字列の一部のみを別のChar配列にコピーするメソッドです。 ToCharArrayメソッドとは異なり、コピー先のChar配列をあらかじめ用意しておく必要があります。
Char配列からの変換 (Stringコンストラクタ)
StringクラスのコンストラクタにChar配列を指定することにより、Char配列から文字列へ変換することが出来ます。
マネージドコードのみの場合はほとんど使うことはありませんが、Stringコンストラクタではcharのポインタやsbyteのポインタから文字列を作成することも出来ます。
Stringクラスで提供されない操作
ここではStringクラスで提供されない文字列操作と、それを実装する例を見ていきます。 以下の例では引数のチェック等は省略しています。
部分文字列の計上 (Count)
Stringクラスでは文字列中に含まれる部分文字列の数(同じ文字列がいくつ含まれているか)を計上するメソッドは用意されていません。 以下は部分文字列の計上を行う例です。 Count1ではIndexOfメソッドを用いて部分文字列の探索を繰り返すことで数を計上しています。 Count2ではReplaceメソッドを用いて部分文字列を削除し、減った文字数をもとに計上しています。
反転 (Reverse)
Stringクラスでは文字列の並びを反転するメソッドは用意されていません。 以下は文字列の反転を行う例です。 ToCharArrayメソッドを用いて一度Char配列にしてから、Array.Reverseメソッドにより反転したのちに再びStringに変換することで文字列の反転を実現しています。
文字列にサロゲートペアが含まれている場合、上記の方法は正しく動作しません。
文字列の反転は、LINQを用いて次のように実装することもできます。
文字列にサロゲートペアが含まれている場合、上記の方法は正しく動作しません。
範囲を指定した置換
Replaceメソッドでは、文字列の範囲を指定して別の文字列に置き換えることはできません。 そういった置換を行う場合は、Substringメソッドで文字列を切り出したあと置き換えたい文字列と連結するようにします。 次の例では、位置を指定して文字列の一部分を置き換えるReplaceメソッドを作成しています。
センタリング
StringクラスではPadLeft・PadRightによる左詰め・右詰めは行えますが、文字列の中寄せ(センタリング)を行うメソッドは用意されていません。 以下は文字列のセンタリングを行う例です。 指定された幅で文字列が中央に来るよう左右に空白を入れています。 文字数よりも幅が下回る場合はそのままにします。
乗算演算子(*, *=)・繰り返した文字列の生成
Stringクラスでは乗算演算子はサポートされていません。 いくつかの言語では、乗算演算子を使って同じ文字の並びを任意の回数だけ繰り返した文字列を作ることが出来ますが、Stringクラスではそういった操作は用意されていません。 またString.Repeatのようなメソッドも用意されていません。 そのため、必要な回数だけ連結を繰り返すなどして作成する必要があります。
この方法で長大な文字列を生成する場合は、パフォーマンスの観点からStringBuilderクラスを使うことも検討してください。
Stringクラスのコンストラクタを使うことで、同じ文字(1文字)を任意の回数だけ繰り替えした文字を作ることが出来ます。 この方法は1文字以上の文字列に対して用いることはできません。
LINQのEnumerable.Repeatメソッドを用いることにより、任意の文字列を繰り返した文字列を作成することができます。
VBの文字列操作関数
(このドキュメントは未整理です)
現在はあまり推奨されませんが、Microsoft.VisualBasic名前空間のStringsクラスのメソッドを使うことで、VB由来の文字列操作関数を使うことも出来ます。 VB.NETでもこれらの関数を使うことは出来ますが、新規に書くコードではできるだけStringクラスのメソッドを使うべきです。 これらの文字列操作関数ではインデックスが1から始まる(1-based)として扱われる一方、.NET Frameworkでは0から始まる(0-based)として扱われるため、混乱を招いたり意図しない動作となる可能性があります。