C# stringの使い方まとめ

目次

文字列内の文字を置き換える(置換)

文字列内の文字を違う文字に置き換えるにはReplaceメソッドを使います。

第1引数に置き換えられる文字列、
第2引数に置き換える文字列を指定します。

Replaceメソッドの戻り値は置き換えられた文字列になり、元の文字列は変わりません。
置き換えられる文字が見つからない場合は元と同じ文字列が返ってきます。
\n“で改行を置き換えることもできます。

using System;
class Program
{
    public static void Main()
    {
        string str1 = "abcdef-abcdef-ABCDEF";

        // bcdをxyzに置き換える
        string str2 = str1.Replace("bcd", "xyz");
        Console.WriteLine($"置換後の文字列={str2}");

        // 元の文字列は変わらない
        Console.WriteLine($"元の文字列  ={str1}");
    }
}
置換後の文字列=axyzef-axyzef-ABCDEF
元の文字列  =abcdef-abcdef-ABCDEF

複数置き換えたい文字がある場合、Replaceをつないで実行します。

using System;
class Program
{
    public static void Main()
    {
        string str1 = "@,b,@,d,e,@";

        // ,を半角スペースに置換した文字列の@を#に置き換える
        string str2 = str1.Replace(",", " ").Replace("@", "#");
        Console.WriteLine(str2);
    }
}
# b # d e #

区切り文字をつけて文字列を連結する

複数の文字列を区切り文字を入れて連結する(Join)

Joinメソッドは第1引数に区切り文字、第2引数以降に結合したい複数の文字列を指定します。第2引数は可変になっているのでいくつでも指定ができます。
戻り値は結合された文字列です。

using System;
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(string.Join(",", "a", "b", "cd", "ef"));
    }
}
a,b,cd,ef

また、第1引数を空文字にするとConcatメソッドと同じような連結ができます。

using System;
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(string.Join("", "a", "b", "c"));  // abc
    }
}

文字列の入った配列、コレクションを区切り文字を入れて連結する(Join)

Joinメソッドの第2引数には配列コレクションを指定することができます。
各要素を区切り文字を付けて連結することが出来ます。
こちらも戻り値は結合された文字列です。

using System;
using System.Collections.Generic;
class Program
{
    static void Main(string[] args)
    {
        var str1 = new string[] { "a", "b", "c", "d", "e" };
        Console.WriteLine(string.Join(",", str1));

        var str2 = new List<string> { "a", "b", "c", "d", "e" };
        Console.WriteLine(string.Join(",", str2));
    }
}

出力結果はこんな感じです。

a,b,c,d,e
a,b,c,d,e

また、文字列以外の配列、コレクションを指定しても文字列に変換して連結してくれます。

using System;
using System.Collections.Generic;
class Program
{
    static void Main(string[] args)
    {
        var num1 = new int[] { 1, 2, 3, 4, 5 };
        Console.WriteLine(string.Join(",", num1));

        var num2 = new List<int> { 6, 7, 8, 9, 10 };
        Console.WriteLine(string.Join(",", num2));
    }
}

出力結果はこんな感じです。

1,2,3,4,5
6,7,8,9,10

文字列の切り出し方法

文字列のから1文字切り出す

文字列から文字を切り出したい場合、[ ](インデクサー)を使います。
インデクサーを使うと文字列を文字の配列のように扱えます。
[ ] の中に0から始まるインデックスを指定します。
インデックスの範囲外を指定した場合はエラーになるので注意が必要です。

^ をインデックスの前に付けると後ろから n番目 という意味になります。
一番最後の文字は [^1] になります。[^0]はエラーになるので注意が必要です。

using System;
class Program
{
    public static void Main()
    {
        string str = "abcde";
        Console.WriteLine(str[0]); // a 1文字目:インデックスは0
        Console.WriteLine(str[1]); // b 2文字目:インデックスは1
        Console.WriteLine(str[2]); // c 3文字目:インデックスは2
        Console.WriteLine(str[3]); // d 4文字目:インデックスは3
        Console.WriteLine(str[4]); // e  5文字目:インデックスは4

        Console.WriteLine(str[^1]); // e
        Console.WriteLine(str[^2]); // d
        Console.WriteLine(str[^3]); // c
        Console.WriteLine(str[^4]); // b
        Console.WriteLine(str[^5]); // a
    }
}

インデックスの最後を表す ^ はC#8.0で登場した機能で、古いバージョンでは使えません。
^ を使わずに最後からn番目の指定をする場合は、Lengthプロパティを使用します。

using System;
class Program
{
    public static void Main()
    {
        string str = "abcde";
        Console.WriteLine(str[str.Length - 1]); // e
        Console.WriteLine(str[str.Length - 2]); // d
        Console.WriteLine(str[str.Length - 3]); // c
        Console.WriteLine(str[str.Length - 4]); // b
        Console.WriteLine(str[str.Length - 5]); // a
    }
}

文字列の部分切り出し(範囲指定)

文字列の切り出し(例えば “abcdef” から2文字目から4文字目まで(bcd)を切り出すなど)はインデクサーの範囲指定( .. )を使います。

[start..end]
startには開始インデックス、endには末尾インデックスを指定します。
切り出される範囲はstartインデックス~endインデックス-1 になるので注意です。

using System;
class Program
{
    public static void Main()
    {
        string str = "abcdef";
        Console.WriteLine(str[1..4]);  //bcd  インデックス1~3まで、4は含まれない
        Console.WriteLine(str[1..^2]); //bcd  後ろからn番目という指定もできる
        Console.WriteLine(str[^5..^2]); //bcd

        //startとendを省略すると全範囲になる
        Console.WriteLine(str[..]);   //abcdef
        //endを省略するとstart~最後までになる
        Console.WriteLine(str[2..]);  //cdef
        //startを省略すると0~endまでになる
        Console.WriteLine(str[..4]);  //abcd
    }
}

インデックスの範囲指定はC#8.0から登場した機能で、古いバージョンでは使えません。
範囲指定を使わずに切り出しを行う場合は、Substringメソッドを使います。

文字列の部分切り出し(Substringメソッド)

Substringメソッドは第1引数に開始インデックス第2引数に切り出す文字数を指定します。
戻り値が切り取られた文字列になります。元の文字列の入った変数自体の値が変わったわけではないので注意が必要です。

using System;
class Program
{
    public static void Main()
    {
        string str = "abcdef";
        Console.WriteLine(str.Substring(1, 3)); //bcd
        Console.WriteLine(str);                 //abcdef
    }
}

開始インデックスだけ指定して最後まで切り出したい場合は、第1引数だけを指定します。
最初の文字から末尾インデックスを指定して切り出したいという場合はLengthプロパティと組み合わせます。

using System;
class Program
{
    public static void Main()
    {
        string str = "abcdef";
        Console.WriteLine(str.Substring(2));                 //cdef
        Console.WriteLine(str.Substring(0, str.Length - 2)); //abcd
    }
}

文字列のnull、空文字を判定する

文字列がNullか空文字か判定する(IsNullOrEmpty)

IsNullOrEmptyメソッドは引数に指定した文字列がnull空文字の場合にTrue、それ以外の場合にFalseを返します。

using System;
class Program
{
    static void Main(string[] args)
    {
        // null, 空文字, 半角スペース, 全角スペース
        var str = new string[] { null, "", " ", " " };
        Console.WriteLine(string.IsNullOrEmpty(str[0]));  // True
        Console.WriteLine(string.IsNullOrEmpty(str[1]));  // True
        Console.WriteLine(string.IsNullOrEmpty(str[2]));  // False
        Console.WriteLine(string.IsNullOrEmpty(str[3]));  // False
    }
}

半角スペース、全角スペースも判定したい場合はIsNullOrWhiteSpaceメソッドを使います。

文字列がNullか空文字か空白か判定する(IsNullOrWhiteSpace)

IsNullOrWhiteSpaceメソッドは引数に指定した文字列がnull空文字空白の場合にTrue、それ以外の場合にFalseを返します。
半角スペース、全角スペースどちらも空白と判定されます。

using System;
class Program
{
    static void Main(string[] args)
    {
        // null, 空文字, 半角スペース×3, 全角スペース, 前後空白スペースの文字
        var str = new string[] { null, "", "   ", " ", " a " };
        Console.WriteLine(string.IsNullOrWhiteSpace(str[0]));  // True
        Console.WriteLine(string.IsNullOrWhiteSpace(str[1]));  // True
        Console.WriteLine(string.IsNullOrWhiteSpace(str[2]));  // True
        Console.WriteLine(string.IsNullOrWhiteSpace(str[3]));  // True
        Console.WriteLine(string.IsNullOrWhiteSpace(str[4]));  // False
    }
}

空文字、空白の判定が一気にできるので必須入力のチェックによく使います。

文字列の順番を逆にする

LINQのReverseメソッドで反転させ、文字列型に戻しています。

using System;
using System.Linq;
class Program
{
    public static void Main()
    {
        var str = "abcde";
        var reverse_str = new string(str.Reverse().ToArray());
        Console.WriteLine($"  元の文字列={str}");
        Console.WriteLine($"反転した文字列={reverse_str}");

    }
}

処理結果はこんな感じです。

  元の文字列=abcde
反転した文字列=edcba

文字列の文字数を取得する

文字列の文字数(長さ)を取得するにはLengthプロパティを使います。

using System;
class Program
{
    public static void Main()
    {
        string str1 = "abcde";
        Console.WriteLine(str1.Length); // 5

        string str2 = "あいうえお";
        Console.WriteLine(str2.Length); // 5
    }
}

Lengthプロパティは半角、全角関係なく文字数が返ってきます。

文字列型を数値型に変換する

文字列型で数字を数値型に変換するには、それぞれの数値のデータ型のParseメソッドを使うか、System.Convertクラスのメソッドを使います。

using System;
class Program
{
    public static void Main()
    {
        // 文字列をint型に変換
        int i1 = int.Parse("123");
        int i2 = Convert.ToInt32("123");

        // 文字列をfloat型に変換
        float f1 = float.Parse("10.12");
        float f2 = Convert.ToSingle("10.12");

        // 文字列をdouble型に変換
        double d1 = double.Parse("5.12345");
        double d2 = Convert.ToDouble("5.12345");
    }
}

上の方法の場合、数値に変換できない文字列の場合エラーになるので注意してください。どんな文字列が指定されるかわからない場合はTryParseメソッドを使います。

各データ型のTryParseメソッドを使うと指定した文字列が数値に変換できたかというフラグと数値に変換された値を取得することができます。

TryParseメソッドの第1引数変換したい文字列を指定します。
第2引数にはoutを使い数値に変換された値を受け取る変数を指定します。
戻り値は変換が成功した場合にTrue、失敗した場合にFalseが返ってきます。

変換に失敗した場合、第2引数の変数にはデフォルト値(0)が返されます。

using System;
class Program
{
    public static void Main()
    {
        // 文字列をint型に変換
        if (int.TryParse("123", out int i))
        {
            Console.WriteLine($"変換に成功 [{i}]");
        }
        else 
        {
            Console.WriteLine($"変換に失敗 [{i}]");
        }

        // 文字列をfloat型に変換
        if (float.TryParse("1.23", out float f))
        {
            Console.WriteLine($"変換に成功 [{f}]");
        }
        else
        {
            Console.WriteLine($"変換に失敗 [{f}]");
        }

        // 文字列をdouble型に変換
        if (double.TryParse("10.123456789", out double d))
        {
            Console.WriteLine($"変換に成功 [{d}]");
        }
        else
        {
            Console.WriteLine($"変換に失敗 [{d}]");
        }

        // 変換に失敗した場合はFalseが返る
        if (int.TryParse("abc", out int value)) 
            Console.WriteLine($"変換に成功 [{value}]");
        else 
            Console.WriteLine($"変換に失敗 [{value}]");
    }
}

outの使い方はこちらの記事を見てください。

文字列の先頭と末尾から指定した文字を取り除く

1文字指定

string.Trimメソッドを使います。
引数に取り除きたい文字(char型)を指定、戻り値は指定した文字を取り除いた文字列(string型)です。

using System;
class Program
{
    public static void Main()
    {
        // 元の文字列
        string str1 = "@@@あいうえお@@@";

        // Trimを使って前後の '@' を取り除く
        string str2 = str1.Trim('@');

        // 結果を表示
        Console.WriteLine($"元の文字列     = {str1}");
        Console.WriteLine($"Trimした文字列 = {str2}");
    }
}

処理結果はこんな感じです。

元の文字列     = @@@あいうえお@@@
Trimした文字列 = あいうえお

複数文字指定

string.Trimの引数に取り除きたい文字を入れたchar型の配列を指定して複数の文字を取り除くことが出来ます。

using System;
class Program
{
    public static void Main()
    {
        // 元の文字列
        string str1 = "@!@ あいうえお @$@";

        // Trimを使って前後の '@', '!', '$', ' ' を取り除く
        char[] trimChars = new char[] { '@', '!', '$', ' ' };
        string str2 = str1.Trim(trimChars);

        // 結果を表示
        Console.WriteLine($"元の文字列     =\"{str1}\"");
        Console.WriteLine($"Trimした文字列 =\"{str2}\"");
    }
}

結果はこんな感じになりました。

元の文字列     ="@!@ あいうえお @$@"
Trimした文字列 ="あいうえお"

文字列のアルファベットを大文字、小文字に変換する

アルファベットを小文字にするにはToLowerメソッド、大文字にするにはToUpperメソッドを使います。
ToLower、ToUpperはそれぞれの戻り値が変換された文字列になります。
下のサンプルの変数str1、str2の中身が大文字・小文字になるわけではないので注意。

using System;
class Program
{
    public static void Main()
    {
        string str1 = "abcde";
        System.Console.WriteLine(str1.ToUpper()); //ABCDE
        System.Console.WriteLine(str1);           //abcde

        string str2 = "ABCDE";
        System.Console.WriteLine(str2.ToLower()); //abcde
        System.Console.WriteLine(str2);           //ABCDE
    }
}

指定した範囲だけ変換するときはこんな感じ、

using System;
class Program
{
    public static void Main()
    {
        var str = "abcde";

        // [..]で範囲指定して大文字に置き換える
        Console.WriteLine(str.Replace(str[0..1], str[0..1].ToUpper()));  // Abcde
    }
}

文字列内の検索

指定した文字が文字列内にあるかどうかを判定

Containsメソッドを使うと文字列内に指定した文字(列)があるかの判定ができます。
第一引数に判定したい文字列を指定します。
戻り値は指定した文字がある場合True、ない場合にFalseが返ってきます。

Containsメソッドはstringのインスタンスに紐づいたメソッドなので、
“abcde”.Contains(“c”)string型変数.Contains(“c”) のような呼び出し方になります。

using System;
class Program
{
    public static void Main()
    {
        string str1 = "abcdefg";
        Console.WriteLine(str1.Contains("zz"));  // False
        Console.WriteLine(str1.Contains("cd"));  // True
    }
}

指定した文字が文字列のどこにあるか検索

IndexOfメソッドを使うと指定した文字列がどこから始まるかの位置(インデックス)を取得することができます。
引数には検索する文字列を指定します。
戻り値は指定した文字列が始まるインデックスが返ってきます。
該当する文字列がなかった場合、-1が返ってきます。

using System;
class Program
{
    public static void Main()
    {
        string str1 = "abcdefg";

        // 該当する文字がなかった場合、-1
        Console.WriteLine(str1.IndexOf("zz")); // -1

        // 文字が始まるインデックス(0からの要素番号)が返ってくる
        Console.WriteLine(str1.IndexOf("cd")); // 2

        // 該当したところから後ろを取得
        int hitIndex = str1.IndexOf("cd");
        Console.WriteLine(str1[hitIndex..^1]); // cdef
    }
}

インデックスは0から始まるので“cd”はインデックス2(3文字目)から始まることになります。

15、16行目は応用で検索でヒットしたところから後ろの文字を取得しています。
stringはインデクサ[ ] を付けるとchar型の配列として扱えるため、範囲指定をして取得することができます。

文字列の先頭と末尾の空白を取り除く

string.Trimメソッドを使うと文字列の先頭と末尾にある空白(半角スペース、全角スペース)を取り除くことができます。string.Trimはstringクラスのインスタンスに紐づいたメソッドなので、呼び出しは、
string型変数.Trim();となります。

戻り値は前後の空白が取り除かれた文字列になります。
元の文字列には影響はありません。

using System;
class Program
{
    public static void Main()
    {
        // 前後に半角スペース
        string str1 = "      abc       ";
        // 前後に全角スペース
        string str2 = "   def    ";

        Console.WriteLine($"Trimした文字列={str1.Trim()}");
        Console.WriteLine($"    元の文字列={str1}");
        Console.WriteLine($"Trimした文字列={str2.Trim()}");
        Console.WriteLine($"    元の文字列={str2}");
    }
}

出力結果はこんな感じです。

Trimした文字列=abc
    元の文字列=      abc
Trimした文字列=def
    元の文字列=   def 

区切り文字を指定して分割する

区切り文字を指定して文字列を分割するにはSplitメソッドを使います。
Splitメソッドの第1引数に区切り文字(char型 または string型)を指定します。
Splitメソッドの戻り値は分割されたstring型の配列です。
元の文字列が入った変数は変わりません。

string str = "a,b,c,d";
string[] ary = str.Split(',');    // ,で分割して変数aryに代入
foreach (string s in ary) {
    System.Console.WriteLine(s);  // 分割された文字列を表示
}
System.Console.WriteLine(str);    //a,b,c,d  元の文字列はそのまま

Splitメソッドを使えばCSVファイル1行の各データを分割することができます。
詳細はこちらの記事を見てください。

文字列の結合

文字列を結合する方法はこちらの記事にまとめました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次