文字列

文字列リテラル (string literals)

string str = "ABC";
標準リテラル文字列と逐語的リテラル文字列 - 文字列 (C# プログラミング ガイド) | Microsoft Docs
"ABC".GetType().FullName; // "System.String"
   
環境で定義されている改行文字列 Environment.NewLine プロパティ

逐語的文字列 (verbatim strings)

エスケープが必要な文字を、それをせずに記述できるようにする機能です。これは先に「@」を付加することで行え、エスケープを省けるため可読性を向上できます。標準リテラル文字列と逐語的リテラル文字列 - 文字列 (C# プログラミング ガイド) | Microsoft Docs

string str1 = "C:\dir\"; // error CS1009: 認識できないエスケープ シーケンスです。

string str2 = "AB // error CS1010: 定数の 新しい行です。
C";               // error CS0103: 現在のコンテキストに 'C' という名前は存在しません。
記述の相違
  標準リテラル文字列 逐語的リテラル文字列
バックスラッシュ
"C:\\dir\\";
@"C:\dir\";
改行
"AB\r\nC";
@"AB
C";
二重引用符
"AB\"C\"D";
@"AB""C""D";

挿入文字列 (interpolated strings)

文字列内に式を記述でき、その結果をその位置に挿入できます。$ (C# リファレンス) | Microsoft Docs

$"text {interpolated-expression [,field-width] [:format-string] } text ..."
挿入文字列 (C#) | Microsoft Docs
double a = 123;

string str1 = $"AB {a} CD";   // "AB 123 CD"
string str2 = $"AB {a,5} CD"; // "AB   123 CD"

String クラス

コンストラクタ

多数のオーバーロードがあり、さまざまな型が許容されます。

コンストラクタ 受け入れる型 処理する文字範囲 備考
String(Char, Int32) Unicode文字 (UTF-16) 全体 同一文字が連続した文字列を生成できる
String(Char*) Unicode文字配列を指すポインタ 全体  
String(Char*, Int32, Int32) Unicode文字配列を指すポインタ 指定範囲  
String(Char[]) Unicode文字配列 全体  
String(Char[], Int32, Int32) Unicode文字配列 指定範囲  
String(SByte*) 8ビット符号付き整数配列を指すポインタ 全体  
String(SByte*, Int32, Int32) 8ビット符号付き整数配列を指すポインタ 指定範囲  
String(SByte*, Int32, Int32, Encoding) 8ビット符号付き整数配列を指すポインタ 指定範囲 処理する文字のエンコーディングを指定できる
コンストラクター - String クラス (System) | MSDN

配列などから生成する場合以外ではコンストラクタを用いることはなく、

string str = "ABC";

のように文字列リテラルを代入します。

文字列の比較

等値

2つの文字列が等しいかどうかは、等値演算子で判断できます。

public static bool operator ==(
    string a,
    string b
)
String.Equality 演算子 (String, String) (System) | MSDN
string str1 = "abc";
bool r1 = str1 == "A";   // false
bool r2 = str1 == "ABC"; // false
bool r3 = str1 == "abc"; // true
String.Equals()
メソッド 比較元 比較方法
Equals(String) この文字列 標準
Equals(String, StringComparison) この文字列 指定の規則
Equals(String, String) 指定の文字列 標準
Equals(String, String, StringComparison) 指定の文字列 指定の規則
String.Equals メソッド (System) | MSDN
StringComparison列挙型
メンバー 並べ替え規則 大文字/小文字の区別
CurrentCulture 現在のカルチャ する
CurrentCultureIgnoreCase 現在のカルチャ しない
InvariantCulture 不変のカルチャ する
InvariantCultureIgnoreCase 不変のカルチャ しない
Ordinal 序数 する
OrdinalIgnoreCase 序数 しない
メンバー - StringComparison 列挙型 (System) | MSDN

相対位置

2つの文字列を並べ替える場合の、前後関係を取得できます。

public static int Compare(
    string strA,
    string strB
)
String.Compare メソッド (String, String) (System) | MSDN String.Compare メソッド (System) | MSDN
int r1 = String.Compare("a", "a"); // 0
int r2 = String.Compare("a", "b"); // -1
int r3 = String.Compare("b", "a"); // 1

int r4 = String.Compare("a", "aa"); // -1

文字列の整形

書式

指定の書式によって整形された文字列を取得できます。

public static string Format(
    string format, // 書式指定文字列
    object arg0    // 整形するオブジェクト
)
String.Format メソッド (System) | MSDN
string str = String.Format("{0}:{1}", "ABC", 10); // "ABC:10"
string s0 = String.Format("{0}"         , "A");                // "A"
string s1 = String.Format("{0}{1}"      , "A", "B");           // "AB"
string s2 = String.Format("{0}{1}{2}"   , "A", "B", "C");      // "ABC"
string s3 = String.Format("{0}{1}{2}{3}", "A", "B", "C", "D"); // "ABCD"

削除

public string Remove(
    int startIndex, // 削除を開始する位置
    int count       // 削除する文字数
)
String.Remove メソッド (Int32, Int32) (System) | MSDN
"ABCD".Remove(1);   // "A"
"ABCD".Remove(2);   // "AB"
"ABCD".Remove(1,2); // "AD"

刈り込み

public string Trim()
String.Trim メソッド (System) | MSDN
" ABC ".Trim(); // "ABC"

.NET Framework 4以降、引数なしのこのメソッドではすべてのUnicode空白文字が除去されます。対象となる文字は.NET 3.5 SP1の前後で変更されており、

  • .NET 4以降、対象から除外
    • ZERO WIDTH SPACE (U+200B)
    • ZERO WIDTH NO-BREAK SPACE (U+FEFF)
  • .NET 4以降、対象に追加
    • MONGOLIAN VOWEL SEPARATOR (U+180E)
    • NARROW NO-BREAK SPACE (U+202F)
    • MEDIUM MATHEMATICAL SPACE (U+205F)

となっています。Remarks - String.Trim Method (System) | MSDN

public string Trim(params char[] trimChars)
String.Trim メソッド (Char[]) (System) | MSDN

除去する文字を指定できます。

" ABC ".Trim(new char[]{' ', 'A'}); // "BC"

Trim()では先頭と末尾から除去されますが、TrimStrat()とTrimEnd()ではそのいずれかだけを対象にできます。

public string TrimStart(params char[] trimChars)
public string TrimEnd(params char[] trimChars)

文字列の連結

加算演算子

加算演算子 (+) で文字列同士を連結、加算代入演算子 (+=) で文字列に対して連結できます。

string str = "AA" + "BB"; // "AABB"
str += 10;                // "AABB10"

多数の文字列を連結するならば、StringBuilderを用います。

String.Concat

複数のオブジェクトまたはStringを、文字列として連結できます。

public static string Concat(
    object arg0,
    object arg1
)
String.Concat メソッド (Object, Object) (System) | MSDN String.Concat メソッド (System) | MSDN
String.Concat("ABC", true);    // "ABCTrue"
String.Concat(10, 'a');        // "10a"
String.Concat(1.5, null, 'B'); // "1.5B"

配列を渡した場合、それが1つならばオーバーロードされたメソッドで要素ごとに連結されますが、複数渡すと型名と解釈されます。

public static string Concat(
    params object[] args
)
String.Concat メソッド (Object[]) (System) | MSDN
String.Concat(     new int[] { 1, 2, 3 }); // "123"
String.Concat("A", new int[] { 1, 2, 3 }); // "ASystem.Int32[]"

String.Join

文字列配列を、指定の区切り文字で連結できます。これとは逆に、指定の区切り文字で分割するならばString.Split()を用います。

public static string Join(
    string separator,
    params string[] value
)
String.Join メソッド (String, String[]) (System) | MSDN
string[] str = new string[] { "a", "b", "c", "", "" };
Console.Write( String.Join(",",str)); // a,b,c,,

引数で開始位置と数を指定することで、連結する範囲を制限できます。

public static string Join(
    string separator,
    string[] value,
    int startIndex, // 使用する最初の要素
    int count       // 使用する要素の数
)
String.Join メソッド (String, String[], Int32, Int32) (System) | MSDN
string[] str = new string[] { "a", "b", "c" };
string r1 = String.Join(",", str, 0, 2); // "a,b"
string r2 = String.Join(",", str, 1, 2); // "b,c"

string r3 = String.Join(",", str, 3, 1); // System.ArgumentOutOfRangeException
string r4 = String.Join(",", str, 1, 3); // System.ArgumentOutOfRangeException

文字列の分割

String.Split

public string[] Split(
    params char[] separator
)
String.Split メソッド (Char[]) (System) | MSDN

separatorがnullまたは文字が含まれていない場合には、空白文字が区切り文字として用いられます。

文字列の検索

戻り値の型 メソッド 機能
int IndexOf() 指定文字が最初に見つかった位置を返す
int LastIndexOf() 指定文字が最後に見つかった位置を返す
bool StartsWith() 先頭が、指定文字列と一致するかどうか
bool EndsWith() 末尾が、指定文字列と一致するかどうか
方法 : String のメソッドを使用して文字列を検索する (C# プログラミング ガイド) | MSDN

高度な条件で検索するには、正規表現のRegex.Match()を用います。

文字が指定位置にあるか確認するだけならば、インデクサで判定できます。

string str = "abc";
bool r = (str[0] == 'a'); // true
public char this[
    int index
] { get; }
String.Chars プロパティ (Int32) (System) | MSDN

IndexOf()

指定文字が最初に見つかった位置を得られます。見つからなかった場合は、-1が返されます。

メソッド 検索対象 検索の開始位置 検索の終了位置 文字の比較方法
IndexOf(Char) 文字 最初 末尾 標準
IndexOf(Char, Int32) 文字 指定位置 末尾 標準
IndexOf(Char, Int32, Int32) 文字 指定位置 開始位置 + 指定文字数 標準
IndexOf(String) 文字列 最初 末尾 標準
IndexOf(String, Int32) 文字列 指定位置 末尾 標準
IndexOf(String, Int32, Int32) 文字列 指定位置 開始位置 + 指定文字数 標準
indexOf(String, StringComparison) 文字列 最初 末尾 指定方法
IndexOf(String, Int32, StringComparison) 文字列 指定位置 末尾 指定方法
IndexOf(String, Int32, Int32, StringComparison) 文字列 指定位置 開始位置 + 指定文字数 指定方法
String.IndexOf メソッド (System) | MSDN

文字列の置換

メソッド 機能
Replace 指定文字を別の文字へ置換し、置換された新しい文字列を返す
Remove 指定位置から指定数の文字を空文字に置換 (削除) し、削除された新しい文字列を返す
方法 : 文字列の内容を変更する (C# プログラミング ガイド) | MSDN
public string Replace(
    char oldChar,
    char newChar
)
String.Replace メソッド (Char, Char) (System) | MSDN
"ABC ABC".Replace('B', 'x'); // "AxC AxC"

高度な条件で置換するには、正規表現のRegex.Replace()を用います。

文字列の判定

メソッド 機能
IsNormalized() この文字列が、Unicode正規形C (Unicode normalization form C) であるかどうか
IsNormalized(NormalizationForm) この文字列が、指定されたUnicode正規形であるかどうか
IsNullOrEmpty(String) 指定された文字列がnullまたはEmpty文字列であるかどうか。これは次のコードに相当する
return (s == null) || (s == String.Empty);
解説 - String.IsNullOrEmpty メソッド (String) (System) | MSDN

パフォーマンスが問題となるならば、このメソッドにより空文字を判定します。CA1820: 文字列の長さを使用して空の文字列をテストします | MSDN

IsNullOrWhiteSpace(String) 指定された文字列がnullまたは空であるか、空白文字だけで構成されているかどうか。これは次のコードに相当する
return String.IsNullOrEmpty(value) || (value.Trim().Length == 0);
解説 - String.IsNullOrWhiteSpace メソッド (String) (System) | MSDN

参考

StringBuilder クラス

  • 不変の文字列 … String クラス
  • 可変の文字列 … StringBuilder クラス

Stringが小さい場合など、StringBuilderに置き換えてもパフォーマンスの向上を望めないことがあります。Remarks - StringBuilder Class (System.Text) | MSDN

StringBuilder stringBuilder = new StringBuilder();

stringBuilder.Append("AAA");
stringBuilder.Append(10);
string str1 = stringBuilder.ToString(); // "AAA10"

stringBuilder.Clear();

stringBuilder.Append(true);
stringBuilder.Append(new DateTime(2001, 2,3));
string str2 = stringBuilder.ToString(); // "True2001/02/03 0:00:00"

メソッド

主要なメソッド
メソッド 機能
Append(Object) 指定オブジェクトの文字列形式を、末尾に追加
AppendFormat(String, Object) 指定オブジェクトを、書式指定して末尾に追加
AppendLine(String) 指定文字列と既定の行終端記号を、末尾に追加
Clear() すべての文字を削除
Insert(Int32, Object) 指定オブジェクトの文字列形式を、指定位置に追加
Remove(Int32, Int32) 指定範囲の文字を削除
Replace(String, String) 指定文字列を、別の指定文字列に置換
ToString() Stringに変換
メソッド - StringBuilder クラス (System.Text) | MSDN

型変換

数値への変換

int a = Int32.Parse("123");
int b = Int32.Parse("0x10"); // System.FormatException
int c = Int32.Parse("A");    // System.FormatException
Int32.Parse メソッド (String) (System) | MSDN

Parse()では変換の失敗時に例外が発生します。それが例外的な事象でないならば、失敗を考慮してTryParse()で処理します。

nt a = 10;
if(Int32.TryParse("123", out a))
{
    Console.Write(a); // 123
}

int b = 10;
if(Int32.TryParse("A", out b))
{
}
else
{
    Console.Write(b); // 0 (変換に失敗した場合は、その型の既定値になる)
}
Int32.TryParse メソッド (String, Int32) (System) | MSDN

10進以外の変換

Int32.Parse()でスタイルを指定して解析するか、Convert.ToInt32()で基数を指定して変換します。

int num1 = Int32.Parse("10", System.Globalization.NumberStyles.HexNumber); // 16
int num2 = Convert.ToInt32("10", 16); // 16
public static int Parse(
    string s,
    NumberStyles style
)
Int32.Parse メソッド (String, NumberStyles) (System) | MSDN
public static int ToInt32(
    string value,
    int fromBase // 基数。2、8、10または16
)
Convert.ToInt32 メソッド (String, Int32) (System) | MSDN

16進数以外も考えるならば、基数を指定して変換できるConvert.ToInt32()の方が融通がききます。

文字配列への変換

public void CopyTo(
    int sourceIndex,
    char[] destination,
    int destinationIndex,
    int count
)
String.CopyTo メソッド (Int32, Char[], Int32, Int32) (System) | MSDN
string source = "ABC";
char[] destination = new char[source.Length];

source.CopyTo(0, destination, 0, destination.Length);

C#のchar (System.Char) は、C++のwchar_tに対応するため、C++のcharに変換するにはMarshalクラスのメソッドを用います。

ポインタへの変換

文字列へsbyteのポインタからアクセスできるようにするには、次のようにします。unmanaged - C#: Converting String to Sbyte* - Stack Overflow

string str = "abc";

byte[] bytes = Encoding.ASCII.GetBytes(str);
unsafe
{
    fixed (byte* pByte = bytes)
    {
        sbyte* pSbyte = (sbyte*)pByte;

        string test = new string(pSbyte); // "abc"
    }
}

ただしこの方法では、ASCII文字以外は適切に処理できません。

文字コードの変換

HTMLエンコード

public static string HtmlEncode(
    string s
)
HttpUtility.HtmlEncode メソッド (String) (System.Web) | MSDN

URLエンコード

public static string UrlEncode(
    string str
)
HttpUtility.UrlEncode メソッド (String) (System.Web) | MSDN

参考

参考書

MSDN (Microsoft Developer Network) から検索