string型のメソッド

文字列操作のためのメソッド

C#ではstring型という文字列を扱う専用のデータ型が用意されています。
単にstring型変数に文字列を保存できるだけでなく、文字列の一部取り出しや加工などの便利な機能が用意されています。

ここでは比較的よく使用するメソッド(関数)を紹介します。
すべてではないのでご注意ください。

なお、ごく基本的な事柄は文字と文字列でも説明しているので、まだ読んでいない方はそちらを先にお読みください。

パス文字列を操作する場合は専用のメソッドを使用したほうが良い場合があります。
詳しくはパス操作を参照してください。

string型の基本

文字と文字列でも説明している基本的な事柄を簡単におさらいしておきます。


//初期化
string str = "abc";

//代入
str = "def";

//文字列結合
str += "ghi" //"defghi"

//一文字取り出し(char型)
char c = str[1]; //'e'

//文字列の長さ(int型)
int length = str.Length; //6

//空文字
str = string.Empty;

//null
str = null;

//空文字のチェック
if(str == string.Empty) {}

//nullのチェック
if(str == null) {}

//nullまたは空文字のチェック
if(string.IsNullOrEmpty(str)) {}

string型に限らず、nullは特殊な値となっています。
nullが代入された状態のstring型変数は、ここで説明するstring型の機能はすべて使用できません。
(代入や比較、nullチェックなどはできます)

特殊な初期化方法

あまり使用頻度は高くないですが、以下のような初期化も可能です。


char[] chars = new char[] { 'a', 'b', 'c', 'd', 'e' };

//char型配列をstring型に変換して代入
string str1 = new string(chars);

//char型配列の1文字目から3文字目までを
//string型に変換して代入
string str2 = new string(chars, 1, 3);

//文字「a」を10文字代入
string str3 = new string('a', 10);

「new」についてはクラスの基礎で説明します。

「string」と「String」

C#では「string」と「String」という二つのデータ型が存在しますが、これらは同じものと考えて構いません。
「string」は「String」の別名です。

例えば空文字を表すEmptyは「string.Empty」「String.Empty」とどちらでも書けますし、内容も同じです。


string empty1 = string.Empty;
string empty2 = String.Empty;

string型のメソッド

IsNullOrEmpty(nullおよび空文字チェック)

IsNullOrEmptyメソッドは引数の文字列がnullもしくは空文字の場合に真(true)を返します。


string str1 = "I have a pen";
string str2 = "";
string str3 = null;

Console.WriteLine(string.IsNullOrEmpty(str1));
Console.WriteLine(string.IsNullOrEmpty(str2));
Console.WriteLine(string.IsNullOrEmpty(str3));
False
True
True

ToUpper、ToLower(大文字、小文字に変換)

文字列を大文字に変換するにはToUpperメソッドを使用します。
文字列を小文字に変換するにはToLowerメソッドを使用します。


string str = "I have a pen";

//I HAVE A PEN
string strUpper = str.ToUpper();

//i have a pen
string strLower = str.ToLower();

C#では変数に続いて「.(ドット)」を記述することで、その変数に対して様々なメソッドを適用することができます。
どのようなメソッドが使用できるかは変数のデータ型によって変わります。

ToUpper、ToLowerはそれぞれ変換後の文字列をstring型で返します。
元の文字列変数は書き換わりません。

string.Concat(文字列の結合)

文字列を結合するにはstring.Concatメソッドを使用します。


string str1 = "acb";
string str2 = "def";

string concat1 = string.Concat(str1, str2);
string concat2 = string.Concat(str1, ", ", str2);

Console.WriteLine(concat1);
Console.WriteLine(concat2);
abcdef
abc, def

+演算子による結合とstring.Concatメソッドによる結合には違いは無いようなので好きな方を使用してください。
ただしstring.Concatメソッドで引数に指定できる値の数は4つまでです。

string.Join(文字列配列の結合)

string型配列の要素を区切り文字を用いて結合するにはstring.Joinメソッドを使用します。


string[] strs = new string[]
{
    "Apple",
    "Grape",
    "Orange"
};

string join = string.Join(":", strs);

Console.WriteLine(join);
Apple:Grape:Orange

第一引数は使用したい区切り文字を指定します。
第二引数は連結したいstring型配列を指定します。
戻り値は区切り文字で連結された文字列です。

もし区切り文字が必要ない場合は空文字に第一引数を指定します。


string[] strs = new string[]
{
    "Apple",
    "Grape",
    "Orange"
};

string join = string.Join(string.Empty, strs);

Console.WriteLine(join);
AppleGrapeOrange

結合開始要素(startIndex)と結合要素数の制限(count)

第三引数と第四引数に数値を指定することで、結合する要素の開始番号(startIndex)と、結合する要素数(count)を指定することができます。


string[] strs = new string[]
{
    "Apple",
    "Grape",
    "Orange",
    "Strawberry",
    "Peach"
};

//配列の1番目の要素から3つ分を結合
string join = string.Join(":", strs, 1, 3);

Console.WriteLine(join);
Grape:Orange:Strawberry

サンプルコードでは「要素の開始番号1から3つ分」の文字列を結合しています。

要素の開始番号は「0」であることに注意してください。

Split(区切り文字で文字列を分割)

文字列を区切り文字で分割して文字列配列に格納するにはSplitメソッドを使用します。


string str = "Apple,Grape,Orange";

string[] split = str.Split(',');

for (int i = 0; i < split.Length; i++)
    Console.WriteLine(split[i]);
Apple
Grape
Orange

戻り値は文字列配列です。

複数の文字を指定

引数の区切り文字は複数同時に指定可能です。


string str = "5+6-2=9";

string[] split = str.Split('+', '-', '=');

for (int i = 0; i < split.Length; i++)
    Console.WriteLine(split[i]);
5
6
2
9

返される配列の要素数の制限(count)

区切り文字として使用する文字をchar型配列にして第一引数に指定し、第二引数に数値(count)を指定すると、戻り値の配列の要素数を制限することができます。


string str = "5+6-2=9";

string[] split = str.Split(
    new char[] { '+', '-', '=' }, 3);

for (int i = 0; i < split.Length; i++)
    Console.WriteLine(split[i]);
5
6
2=9

サンプルコードでは戻り値の配列の要素数が「3」になった時点で処理を停止し配列を返却します。

空の要素を削除した配列を返す

Splitメソッドは、文字列の分割によって戻り値に配列に空の要素(文字数ゼロ)が含まれることがあります。
以下のサンプルコードでは、配列のサイズは「5」ですが、「1」「3」の要素は空文字です。


string str = "Apple, Grape, Orange";

string[] split = str.Split(
    new char[] { ',', ' ' });

for (int i = 0; i < split.Length; i++)
    Console.WriteLine(split[i]);
Apple

Grape

Orange

この空の要素を戻り値の配列に含めない場合はStringSplitOptions.RemoveEmptyEntriesを使用します。


string str = "Apple, Grape, Orange";

string[] split = str.Split(
    new char[] { ',', ' ' },
    StringSplitOptions.RemoveEmptyEntries);

for (int i = 0; i < split.Length; i++)
    Console.WriteLine(split[i]);
Apple
Grape
Orange

文字列の分割の結果、文字数がゼロになる要素は戻り値から省かれ、戻り値の配列サイズが「3」になっています。

区切り文字に文字列を指定

区切り文字に文字ではなく文字列を指定するには以下のようにします。


string str = "Apple, Grape, Orange";

string[] split = str.Split(
    new string[] { ", " },
    StringSplitOptions.None);

for (int i = 0; i < split.Length; i++)
    Console.WriteLine(split[i]);
Apple
Grape
Orange

まず、区切り文字として使用したい文字列を配列にします。
(たとえ一つしかない場合でも配列にする必要があります)
さらに、第二引数にStringSplitOptions.NoneStringSplitOptions.RemoveEmptyEntriesのいずれかを渡します。

Noneは戻り値の配列に空の要素が含まれていてもそのまま返します。
RemoveEmptyEntriesは空の要素は省いて返します。

Trim、TrimStart、TrimEnd(先頭および末尾の空白の除去)

文字列の前後にある不要な空白を除去するにはTrimメソッドを使用します。
文字列の先頭のみを除去する場合はTrimStartメソッドを、文字列の末尾のみを除去する場合はTrimEndメソッドを使用します。


string str = "  I have a pen  ";

//「I have a pen」
string trim = str.Trim();

//「I have a pen  」
string trimStart = str.TrimStart();

//「  I have a pen」
string trimEnd = str.TrimEnd();

上記のコメントのカギ括弧は見た目をわかりやすくするためのもので、実際には出力されません。

削除対象になるのは半角スペース全角スペース改行文字のいずれかです。
タブ文字などは削除されません。

指定文字を削除する

特定の文字を除去対象にするには引数に文字(char型)を指定します。
これは複数同時に指定可能です。


string str = " I have a pen.; ";

//「I have a pen」
string trim = str.Trim(' ', '.', ';');

引数に文字を指定すると、その文字だけが削除対象になります。
つまり半角スペースなどは削除対象にならなくなるので、従来通り除去したい場合は明示的に指定する必要があります。

なお、文字列の途中に指定文字があっても除去されません。
あくまでも文字の前後の不要文字を除去するメソッドです。


string str = " I have a pen ";

//「have a pen」
string trim = str.Trim(' ', 'I', 'a');

IndexOf(文字列の検索)

文字列内から特定の文字を検索するにはIndexOfメソッドを使用します。


string str = "abcde";

int index1 = str.IndexOf('d'); //3

int index2 = str.IndexOf('z'); //-1

int index3 = str.IndexOf("cde"); //2

IndexOfメソッドは、先頭文字を0文字目として先頭から引数に指定した文字(char型)または文字列(string型)を検索し、見つかった位置を返します。
文字が見つからなかった場合は「-1」を返します。

文字列の途中から検索する(startIndex)

IndexOfの第二引数に数値(startIndex)を指定することで、文字列の途中から検索が可能です。


string str = "I have a pen";
int index = -1;

while(true)
{ 
    index = str.IndexOf('a', ++index);
    if (index >= 0)
        Console.WriteLine(index);
    else
        break;
}
3
7

サンプルコードは文字列中から「a」が出現する場所をすべて表示しています。
ループ一回目は「0」、つまり先頭から文字を検索します。
ループ二回目は、前回見つかった位置に1を加算(インクリメント)し、前回の検出位置以降を検索対象にします。
(加算しないと前回の検出位置を再び検出してしまうので無限ループになる)
変数indexを「-1」で初期化しているのはこの加算があるためです。

検索文字数を制限する(count)

検索開始位置から○文字目までを検索対象にする場合は、startIndexを指定した上で第三引数にさらに数値(count)を指定します。


string str = "I have a pen";

//0文字目から末尾まで検索
int index1 = str.IndexOf('a', 0); //3

//0文字目から3文字までを検索
int index2 = str.IndexOf('a', 0, 3); //-1

7行目の検索は先頭から3文字分、つまり「I h」までが検索対象です。

大文字小文字を区別しない

通常は大文字と小文字とは区別して検出しますが、第二引数(startIndex使用時は第三、count使用時は第四引数)にStringComparison.OrdinalIgnoreCaseを指定することで、大文字小文字の区別なく検索できます。


string str = "Apple, Grape, Orange";

int index1 = str.IndexOf("a");
int index2 = str.IndexOf("a", StringComparison.OrdinalIgnoreCase);

Console.WriteLine(index1);
Console.WriteLine(index2);
9
0

ただし、StringComparison.OrdinalIgnoreCaseを使用する場合は検索文字にchar型は指定できなくなります。
(一文字であってもstring型を指定する)

なお、大文字小文字を区別しないで検索するには、あらかじめToUpperToLowerで大文字、小文字に変換してから検索するという方法もあります。
しかし一旦変換する処理が入るので、速度的にはStringComparison.OrdinalIgnoreCaseのほうが有利です。


string str = "Apple, Grape, Orange";

//小文字に変換してから検索
int index1 = str.ToLower().IndexOf("a");

LastIndexOf(文字列の後方検索)

IndexOfメソッドは文字列を先頭から検索しますが、LastIndexOfメソッドは末尾から検索します。


string str = "I have a pen";

int index = str.IndexOf('a'); //3

int lastIndex = str.LastIndexOf('a'); //7

あくまでも「文字列を後ろから検索」するだけで、返される値は「先頭から数えた文字数」なので注意してください。

startIndex、count、StringComparison.OrdinalIgnoreCaseの指定はIndexOfメソッドと同じです。

IndexOfAny(複数の文字の検索)

IndexOfAnyメソッドは、第一引数に指定されたchar型配列内のいずれかの文字が最初に出現する位置を文字列から検索します。


string str = "I have a pen";
char[] chars = new char[] { 'a', 'h', 'p' };

int index1 = str.IndexOfAny(chars); //2

//startIndex
//5文字目から末尾までを検索
int index2 = str.IndexOfAny(chars, 5); //7

//startIndex, count
//5文字目から2文字分を検索
int index3 = str.IndexOfAny(chars, 5, 2); //-1

複数の文字を同時に検索対象にできる以外はIndexOfと同じです。
startIndexやcountを使用した検索もできます。
ただし文字列(string型)の検索と、大文字小文字の区別のない検索(StringComparison.OrdinalIgnoreCase)はできません。

LastIndexOfAny(複数の文字の後方検索)

LastIndexOfAnyメソッドは、IndexOfAnyの後方検索版です。
IndexOfLastIndexOfの関係と同じです。


string str = "I have a pen";
char[] chars = new char[] { 'a', 'h', 'p' };

int index1 = str.LastIndexOfAny(chars); //9

//startIndex
int index2 = str.LastIndexOfAny(chars, 5); //3

//startIndex, count
int index3 = str.LastIndexOfAny(chars, 5, 2); //-1

Contains(部分一致)

文字列内に特定の文字列が含まれるかを判定するにはContainsメソッドを使用します。


string str = "I have a pen";

bool contains1 = str.Contains("ve a"); //true
bool contains2 = str.Contains("apen"); //false

IndexOfのように文字の位置を返すのではなく、「含まれるか否か」をbool型で返します。
位置情報が必要ない場合はこちらが便利です。

StartsWith、EndsWith(前方一致、後方一致)

文字列が特定の文字列で開始するかを判定するにはStartsWithメソッドを使用します。
特定の文字列で終わるかを判定するにはEndsWithメソッドを使用します。


string str = "I have a pen";

bool startsWith1 = str.StartsWith("I h"); //true
bool startsWith2 = str.StartsWith("have"); //false

bool endsWith1 = str.EndsWith("en"); //true
bool endsWith2 = str.EndsWith("a"); //false

これらは第二引数にStringComparison.OrdinalIgnoreCaseを指定することで大文字小文字を区別しない判定が可能です。

Equals(文字列の等値判定)

文字列がある文字列と同一かを比較するには「==」(等値演算子) を使用します。
それ以外に、Equalsメソッドを使用する方法もあります。
(日本語で発音すれば「イコール(ス)」)


string str = "Pencil";

bool op = str == "Pencil";          //true
bool equals = str.Equals("Pencil"); //true

大文字小文字を区別しない

Equalsメソッドは第二引数にStringComparison.OrdinalIgnoreCaseを指定することで大文字小文字に依存しない判定も可能です。


string str = "Pencil";

//false
bool op = str == "pencil";

//true
bool equals = str.Equals("pencil", StringComparison.OrdinalIgnoreCase);

nullチェックはできない

Equalsメソッドではstring型変数のnullチェックはできないので注意してください。
nullチェックは「==」かstring.IsNullOrEmptyメソッドを使用してください。


string str = null;

//エラー
bool equals = str.Equals(null);

静的メソッド版

Equalsメソッドには静的メソッド版もあります。
こちらはnullチェックも可能です。


string str = null;

bool equals = string.Equals(str, null); //true

比較したい変数の中身がnullになる可能性がある場合は静的メソッド版を使用したほうが良いでしょう。

SubString(文字列の部分取得)

文字列から一部を取り出すにはSubStringメソッドを使用します。


string str = "I have a pen";

//開始位置から末尾まで取得
string subString1 = str.Substring(7);

//開始位置からn文字を取得
string subString2 = str.Substring(7, 3);

Console.WriteLine(subString1);
Console.WriteLine(subString2);
a pen
a p

Remove(文字列の部分削除)

文字列から一部を削除した文字列を得るにはRemoveメソッドを使用します。


string str = "I have a pen";

//6文字目から末尾まで削除
string remove1 = str.Remove(6);

//6文字目から3文字を削除
string remove2 = str.Remove(6, 3);

Console.WriteLine(remove1);
Console.WriteLine(remove2);
I have 
I havepen

Replace(文字列の置き換え)

文字列の一部を別の文字列で置き換えるにはReplaceメソッドを使用します。


string str = "I have a pen";

string replace1 = str.Replace("a pen", "an apple");

//半角スペースをすべて削除
string replace2 = str.Replace(" ", string.Empty);

Console.WriteLine(replace1);
Console.WriteLine(replace2);
I have an apple
Ihaveapen

Replaceメソッドは文字列中から第一引数に一致する文字列をすべて検索し、第二引数で置き換えた文字列を返します。
第二引数に空文字を指定することで、特定の文字列の一括削除ができます。

PadLeft、PadRight(文字列の空白詰め)

PadLeftメソッドは、指定の文字数に達するまで文字列の左側を空白で埋めます。
PadRightメソッドは右端を空白で埋めます。


string str1 = "1";
string str2 = "20";

str1 = str1.PadLeft(4);
str2 = str2.PadLeft(4);

Console.WriteLine(str1);
Console.WriteLine(str2);
    1
20  

数値の桁数を合わせる時などに便利です。

指定の文字で埋める

第二引数に文字(char型)を指定すると、空白の代わりにその文字で埋められます。


string str1 = "1";
string str2 = "20";

str1 = str1.PadLeft(4, '0');
str2 = str2.PadLeft(4, '*');

Console.WriteLine(str1);
Console.WriteLine(str2);
0001
20**

string.Compare(文字列の順序比較)

string.Compareメソッドは二つの文字列を比較し、並べ替えに使用する順序を整数で返します。


string str1 = "Apple";
string str2 = "Orange";
string str3 = "Grape";

//-1
int compare1 = string.Compare(str1, str2);

//1
int compare2 = string.Compare(str2, str3);

//0
int compare3 = string.Compare(str1, str1);

「Apple」と「Orange」をアルファベット順に並べた時、「Apple」のほうが順序が先になります。
この場合、Compareメソッドは「-1」を返します。

「Orange」と「Grape」をアルファベット順に並べた時、「Grape」のほうが順序が先になります。
この場合、Compareメソッドは「1」を返します。

比較する文字列が同一の時はCompareメソッドは「0」を返します。

このメソッドは主に配列などの並び替え時に使用します。
単純に二つの文字列が同一か否かを判定する場合はEqualsメソッドを使用すべきです。

大文字小文字を区別しない

Compareメソッドは第三引数にStringComparison.OrdinalIgnoreCaseを指定することで大文字小文字に依存しない判定も可能です。

string.Format(文字列の書式指定)

string.Formatメソッドは文字列を書式に従って整形することができます。
このメソッドの使用方法は非常に多岐に渡るでページを分割しています。
詳しくはstring.Formatメソッドを参照してください。