.NET Visual C#言語入門 > 文字列(string)
のぶ亭『プログラミングの相談窓口』 … 様々なプログラミング問題を個別対応致します |
文字列(string)
string型は、Unicode文字の文字列を管理します。
- stringは、.NET FrameworkのSystem.Stringのエイリアス
- 初期化された文字列は変更できない
つまり、文字列オブジェクトの内容はオブジェクトの作成後は変更できません - stringは参照型
- 等値演算子 (== および !=) は、値を比較します
string a = "こんにちは"; string b = "こ"; b += "んにちは"; Console.WriteLine(a == b); Console.WriteLine((object)a == (object)b);
文字列の内容が等しいので、"True"、"False" の順に表示されます。
文字列の連結-+ 演算子を使用
string a = "おはよう" + "ございます";
aオブジェクトには、"おはようございます"の文字列オブジェクトが作成されます。
stringの各文字へのアクセス-[] 演算子を使用
string str = "test"; char x = str[2]; // x = 's';
文字列リテラル
文字列リテラルは、string 型で
- 二重引用符で囲む形式 - "文字列"
エスケープ・シーケンスを処理する形式// 文字列リテラルの前後に二重引用符 (") を付ける string a = "good morning"; // エスケープ・シーケンスを含む任意の文字リテラルの場合 string a = "\\\u0066\n"; // 円記号 (\)、文字 f、改行文字
- @ と二重引用符で囲む形式 - @"文字列"
エスケープ・シーケンスを処理しない形式 (ファイルパスが記述しやすくなる)// 先頭に@を付け、リテラル文字列の前後に二重引用符を付ける @"good morning" // ファイルパスの例 @"c:\Temp\Source\a.txt" // 通常は"c:\\Temp\\Source\\a.txt" // 二重引用符を含める場合、二重引用符を二重にする string Text = @"""Ahoy!"""; // "\"Ahoy!\"" と等価
の2通りがあります。
エスケープ文字
文字列には"\n"(改行)や"\t"(タブ)などのエスケープ文字が使用できます。\udddd (ddddは4桁数字)は、Unicode文字U+ddddを表します。
8桁のUnicode エスケープ文字\udddd\uddddも認識できます。
using System; class TestClass { static void Main() { string a = "\u0068ello "; string b = "world"; Console.WriteLine( a + b ); Console.WriteLine( a + b == "hello world" ); } }
出力
hello world True
基本的な文字列操作
新しい文字列の作成
メソッド名 (MSDN) | 使用方法 |
---|---|
String.Format | 書式設定された文字列を作成 |
String.Concat | 2つ以上の文字列を連結して、新しい文字列を作成 |
String.Join | 文字列の配列を結合して、新しい文字列を作成 |
String.Insert | 指定したインデックス位置に文字列を挿入して、新しい文字列を作成 |
String.CopyTo | 文字の配列内の指定した位置に、文字列内の指定した文字をコピー |
文字のトリムと削除
メソッド名 (MSDN) | 用途 |
---|---|
String.Trim | 文字列の先頭と末尾から空白を削除 |
String.TrimEnd | 文字列の末尾から、文字配列で指定した文字を削除 |
String.TrimStart | 文字列の先頭から、文字配列で指定した文字を削除 |
String.Remove | 文字列内の指定したインデックス位置から、指定した数の文字を削除 |
文字列の埋め込み
メソッド名 (MSDN) | 用途 |
---|---|
String.PadLeft | 文字列の右端の文字位置が、文字列の先頭から指定した文字数の位置になるように、その文字列を右寄せにして文字を埋め込む |
String.PadRight | 文字列の右端の文字位置が、文字列の末尾から指定した文字数の位置になるように、その文字列を左寄せにして文字を埋め込む |
文字列の比較
メソッド名 (MSDN) | 用途 |
---|---|
String.Compare | 2つの文字列の値を比較し、その結果を整数値で返す |
String.CompareOrdinal | 2つの文字列を比較し、その結果を整数値で返す(ローカル・カルチャに無関係) |
String.CompareTo | 現在の文字列オブジェクトを別の文字列と比較し、結果を整数値で返す |
String.Equals | 2つの文字列が等しいかどうかを確認し、結果をBoolean値で返す |
文字列の検索
メソッド名 (MSDN) | 用途 |
---|---|
String.StartsWith | 指定文字列で始まるかを確認し、結果をBoolean値で返す |
String.EndsWith | 指定文字列で終わるかを確認し、結果をBoolean値で返す |
String.IndexOf | 指定文字列を先頭から検索し、見つかったインデックス位置を整数値で返す |
String.LastIndexOf | 指定文字列を末尾から検索し、見つかったインデックス位置を整数値で返す |
正規表現を使用 | 「.NET Framework の正規表現(MSDN)」を参照 |
大文字と小文字の変更
メソッド名 (MSDN) | 用途 |
---|---|
String.ToUpper | 文字列内のすべての文字を大文字に変換 |
String.ToLower | 文字列内のすべての文字を小文字に変換 |
StringBuilderクラスの使用
System.Text.StringBuilder(MSND)クラスを使用すると、新しいオブジェクトを作成せずに文字列を変更できます。たとえば、ループ内で多数の文字列を連結する場合に、StringBuilder クラスを使用することでパフォーマンスを向上させることができます。
Stringオブジェクトは不変オブジェクトです。Stringオブジェクトは、メソッドを使用するたび、メモリ内に新しい文字列オブジェクトを作成し、その文字列オブジェクトに対して新しい領域を割り当てています。
そのため、文字列を何度も変更する場合は、新しいStringオブジェクトの作成によって発生するオーバーヘッドが問題となることがあります。
using System; class StringBuilderTest { static void Main() { string two = "2"; StringBuilder sb = new StringBuilder(); sb.Append("1 "); sb.Append(two); sb.Append(" 3"); Console.WriteLine(sb.ToString()); string str = sb.ToString(); Console.WriteLine(str); } }
文字列を分解する
System.String.Split(MSND)メソッドで、指定された文字(区切り記号)で文字列を分解することができます。
区切り記号は、複数個指定することができます。例えば、文字列に”空白、コンマ、ピリオド、コロン、タブ”があれば、それらを区切りとして文字列が分割されます。
class TestStringSplit { static void Main() { char[] DelimiterChars = { ' ', ',', '.', ':', '\t' }; // 区切り文字 string Text = "one\ttwo three:four,five six seven";// 対象文字列 string[] Words = Text.Split(delimiterChars); // 分割された文字列配列 System.Console.WriteLine("オリジナル文字列 [{0}]", Text); System.Console.WriteLine("文字列のワード数 {0}個", Words.Length); foreach (string s in Words) { System.Console.WriteLine(s); } } }