ここではStringクラスに用意されている機能のうち、文字列から一部分を取得したり、置換するなどといった文字列の加工と編集を行うためのメソッド等について見ていきます。

ここで解説する文字列の加工・編集の操作と、対応する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クラスのメソッド 解説へのリンク

上記以外のメソッドやここでは扱わない事項・関連する事項に関しては以下を参照してください。

文字列の加工・編集

連結 (Concat, +, +=)

String.Concatメソッドは文字列同士の連結を行う静的メソッドで、任意の数の文字列を連結出来ます。 またC#、VBでは加算演算子+、および複合代入の加算演算子+=を使った連結もできるようになっています。

+演算子・String.Concatメソッドを使って文字列同士を連結する
using System;

class Sample {
  static void Main()
  {
    var s1 = "foo";
    var s2 = "bar";

    // +演算子による連結
    Console.WriteLine(s1 + s2);
    Console.WriteLine(s1 + s2 + "baz");
    Console.WriteLine(s1 + s2 + "baz" + "qux");

    // String.Concatメソッドによる連結
    Console.WriteLine(String.Concat(s1, s2));
    Console.WriteLine(String.Concat(s1, s2, "baz"));
    Console.WriteLine(String.Concat(s1, s2, "baz", "qux"));

    // 連結と代入を同時に行う場合は+演算子または+=演算子を使うことができる
    s1 = s1 + "baz";

    Console.WriteLine(s1);

    s2 += "quz";

    Console.WriteLine(s2);
  }
}
+演算子・String.Concatメソッドを使って文字列同士を連結する
Imports System

Class Sample
  Shared Sub Main()
    Dim s1 As String = "foo"
    Dim s2 As String = "bar"

    ' +演算子による連結
    Console.WriteLine(s1 + s2)
    Console.WriteLine(s1 + s2 + "baz")
    Console.WriteLine(s1 + s2 + "baz" + "qux")

    ' String.Concatメソッドによる連結
    Console.WriteLine(String.Concat(s1, s2))
    Console.WriteLine(String.Concat(s1, s2, "baz"))
    Console.WriteLine(String.Concat(s1, s2, "baz", "qux"))

    ' 連結と代入を同時に行う場合は+演算子または+=演算子を使うことができる
    s1 = s1 + "baz"

    Console.WriteLine(s1)

    s2 += "qux"

    Console.WriteLine(s2)
  End Sub
End Class
実行結果
foobar
foobarbaz
foobarbazqux
foobar
foobarbaz
foobarbazqux
foobaz
barqux

.NET Framework 4からは、IEnumerable<String>を引数にとるバージョンのConcatも用意されています。 これを利用するとListに格納されている複数の文字列を一つに連結するということがメソッド呼び出し一つで行えます。

String.Concatメソッドを使って複数の文字列(IEnumerable<String>)をまとめて連結する .NET Framework 4
using System;
using System.Collections.Generic;

class Sample {
  static void Main()
  {
    var l = new List<string>() {"foo", "bar", "baz", "qux"};

    // リストl内の文字列をすべて連結する
    Console.WriteLine(String.Concat(l));
  }
}
実行結果
foobarbazqux

複製 (Copy)

String.Copyメソッドは文字列の複製を行う静的メソッドです。 見かけ上の動作は文字列変数の単なる代入と似ていますが、Copyメソッドでは指定された文字列と同じ内容の新しいインスタンスが作成される点が異なります。

String.Copyメソッドを使って文字列インスタンスの複製を作成する
using System;

class Sample {
  static void Main()
  {
    var s1 = "foo";
    string s2;
    string s3;

    s2 = s1; // 文字列s1をs2に代入する
    s3 = String.Copy(s1); // 文字列s1の複製を作成し、s3に代入する

    Console.WriteLine(s1);
    Console.WriteLine("{0} {1}", s2, Object.ReferenceEquals(s2, s1)); // s1とs2は同一のインスタンスへの参照となる
    Console.WriteLine("{0} {1}", s3, Object.ReferenceEquals(s3, s1)); // s1とs3は同一の文字列だが異なるインスタンスへの参照となる
  }
}
String.Copyメソッドを使って文字列インスタンスの複製を作成する
Imports System

Class Sample
  Shared Sub Main()
    Dim s1 As String = "foo"
    Dim s2 As String
    Dim s3 As String

    s2 = s1 ' 文字列s1をs2に代入する
    s3 = String.Copy(s1) ' 文字列s1の複製を作成し、s3に代入する

    Console.WriteLine(s1)
    Console.WriteLine("{0} {1}", s2, s2 Is s1) ' s1とs2は同一のインスタンスへの参照となる
    Console.WriteLine("{0} {1}", s3, s3 Is s1) ' s1とs3は同一の文字列だが異なるインスタンスへの参照となる
  End Sub
End Class
実行結果
foo
foo True
foo False

代入と複製の違い、参照の比較についてはオブジェクトの複製値型と参照型 §.同値性・同一性の比較などを参照してください。

切り出し (Substring)

String.Substringメソッドは文字列から部分文字列を切り出すメソッドで、切り出す最初のインデックスと長さを指定することで文字列の一部分を取得します。 長さを指定しなかった場合は、指定されたインデックスから文字列の最後までが返されます。

String.Substringメソッドを使って文字列の一部分を切り出す
using System;

class Sample {
  static void Main()
  {
    var s = "The quick brown fox jumps over the lazy dog";

    Console.WriteLine(s.Substring(0, 9)); // 0文字目から9文字分を切り出す
    Console.WriteLine(s.Substring(31)); // 31文字目以降を切り出す
  }
}
String.Substringメソッドを使って文字列の一部分を切り出す
Imports System

Class Sample
  Shared Sub Main()
    Dim s As String = "The quick brown fox jumps over the lazy dog"

    Console.WriteLine(s.Substring(0, 9)) ' 0文字目から9文字分を切り出す
    Console.WriteLine(s.Substring(31)) ' 31文字目以降を切り出す
  End Sub
End Class
実行結果
The quick
the lazy dog

挿入 (Insert)

String.Insertメソッドは文字列に別の文字列を挿入するメソッドです。 Insertメソッドは別の文字列を挿入した結果を返します。

String.Insertメソッドを使って文字列に別の文字列を挿入する
using System;

class Sample {
  static void Main()
  {
    var s = "The quick brown fox jumps over the lazy dog";

    Console.WriteLine(s);
    Console.WriteLine(s.Insert(40, "white ")); // 40文字目に"white "を挿入
  }
}
String.Insertメソッドを使って文字列に別の文字列を挿入する
Imports System

Class Sample
  Shared Sub Main()
    Dim s As String = "The quick brown fox jumps over the lazy dog"

    Console.WriteLine(s)
    Console.WriteLine(s.Insert(40, "white ")) ' 40文字目に"white "を挿入
  End Sub
End Class
実行結果
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy white dog

このメソッドでは、元の文字列には変更を加えず、挿入した結果を新しい文字列として返します。

削除 (Remove)

String.Removeメソッドは文字列の一部分を削除した文字列を取得するメソッドで、削除を始める最初のインデックスと長さを指定することで文字列の一部分を削除します。 長さを指定しなかった場合は、指定されたインデックスから文字列の最後までが削除されます。

String.Removeメソッドを使って文字列の一部分を削除する
using System;

class Sample {
  static void Main()
  {
    var s = "The quick brown fox jumps over the lazy dog";

    Console.WriteLine(s);
    Console.WriteLine(s.Remove(4, 6)); // 4文字目から6文字分を削除
    Console.WriteLine(s.Remove(25)); // 25文字目以降を削除
  }
}
String.Removeメソッドを使って文字列の一部分を削除する
Imports System

Class Sample
  Shared Sub Main()
    Dim s As String = "The quick brown fox jumps over the lazy dog"

    Console.WriteLine(s)
    Console.WriteLine(s.Remove(4, 6)) ' 4文字目から6文字分を削除
    Console.WriteLine(s.Remove(25)) ' 25文字目以降を削除
  End Sub
End Class
実行結果
The quick brown fox jumps over the lazy dog
The brown fox jumps over the lazy dog
The quick brown fox jumps

このメソッドでは、元の文字列には変更を加えず、削除した結果を新しい文字列として返します。

位置を指定した削除ではなく、部分文字列を指定した削除(特定の文字列の削除)にはReplaceメソッドを使用します。

置換 (Replace)

String.Replaceメソッドは文字列内の部分文字列を別の部分文字列に置き換えるメソッドです。 一致する文字列はすべて置き換えられます。

String.Replaceメソッドを使って文字列の一部分を別の文字列に置換する
using System;

class Sample {
  static void Main()
  {
    var s = "The quick brown fox jumps over the lazy dog";

    Console.WriteLine(s);
    Console.WriteLine(s.Replace("quick", "clever")); // "quick"を"clever"に置き換え
    Console.WriteLine(s.Replace("lazy", "silly")); // "lazy"を"silly"に置き換え
  }
}
String.Replaceメソッドを使って文字列の一部分を別の文字列に置換する
Imports System

Class Sample
  Shared Sub Main()
    Dim s As String = "The quick brown fox jumps over the lazy dog"

    Console.WriteLine(s)
    Console.WriteLine(s.Replace("quick", "clever")) ' "quick"を"clever"に置き換え
    Console.WriteLine(s.Replace("lazy", "silly")) ' "lazy"を"silly"に置き換え
  End Sub
End Class
実行結果
The quick brown fox jumps over the lazy dog
The clever brown fox jumps over the lazy dog
The quick brown fox jumps over the silly dog

このメソッドでは、元の文字列には変更を加えず、置換した結果を新しい文字列として返します。

最初に一致する箇所だけ置換したい場合など、一括置換以外に条件を加えたいといった場合には、正規表現を使うことができます。 具体例についてはRegex.MatchメソッドMatch.Resultメソッドを使った例を参照してください。


String.Replaceメソッドメソッドでは、置き換え後の文字列としてnull/Nothingもしくは空文字(String.Empty)を指定すると、置き換え前の部分文字列を削除することが出来ます。

String.Replaceメソッドを使って文字列の一部分を空の文字列に置き換えて削除する
using System;

class Sample {
  static void Main()
  {
    var s = "The quick brown fox jumps over the lazy dog";

    Console.WriteLine(s);
    Console.WriteLine(s.Replace("brown ", "")); // "brown "を削除
    Console.WriteLine(s.Replace("lazy ", null)); // "lazy "を削除
  }
}
String.Replaceメソッドを使って文字列の一部分を空の文字列に置き換えて削除する
Imports System

Class Sample
  Shared Sub Main()
    Dim s As String = "The quick brown fox jumps over the lazy dog"

    Console.WriteLine(s)
    Console.WriteLine(s.Replace("brown ", "")) ' "brown "を削除
    Console.WriteLine(s.Replace("lazy ", Nothing)) ' "lazy "を削除
  End Sub
End Class
実行結果
The quick brown fox jumps over the lazy dog
The quick fox jumps over the lazy dog
The quick brown fox jumps over the dog

また、Replaceメソッドでは文字(Char)単位での置換も行えます。

String.Replaceメソッドを使って文字列内の一部の文字(Char)を別の文字に置き換える
using System;

class Sample {
  static void Main()
  {
    var s = "The quick brown fox jumps over the lazy dog";

    Console.WriteLine(s);
    Console.WriteLine(s.Replace('o', 'a')); // oをaに置換
  }
}
String.Replaceメソッドを使って文字列内の一部の文字(Char)を別の文字に置き換える
Imports System

Class Sample
  Shared Sub Main()
    Dim s As String = "The quick brown fox jumps over the lazy dog"

    Console.WriteLine(s);
    Console.WriteLine(s.Replace("o"c, "a"c)) ' oをaに置換
  End Sub
End Class
実行結果
The quick brown fox jumps over the lazy dog
The quick brawn fax jumps aver the lazy dag

分割 (Split)

String.Splitメソッドは文字列の分割を行うメソッドで、区切りとなる文字(char/Char)または文字列を指定し、それを区切りとして分割した結果を文字列の配列で返します。

String.Splitメソッドを使って指定した区切り文字で文字列を分割する
using System;

class Sample {
  static void Main()
  {
    var s = "The quick brown fox jumps over the lazy dog";
    var words = s.Split(' '); // 空白文字' 'を区切りとして文字列sを分割

    foreach (var word in words) {
      Console.WriteLine(word);
    }
  }
}
String.Splitメソッドを使って指定した区切り文字で文字列を分割する
Imports System

Class Sample
  Shared Sub Main()
    Dim s As String = "The quick brown fox jumps over the lazy dog"
    Dim words As String() = s.Split(" "c) ' 空白文字" "を区切りとして文字列sを分割

    For Each word As String In words
      Console.WriteLine(word)
    Next
  End Sub
End Class
実行結果
The
quick
brown
fox
jumps
over
the
lazy
dog
String.Splitメソッドを使って指定した区切り文字列で文字列を分割する
using System;

class Sample {
  static void Main()
  {
    var s = "The quick brown\r\nfox jumps over\r\nthe lazy dog";
    var lines = s.Split("\r\n"); // 改行の文字列"\r\n"を区切りとして文字列sを分割

    foreach (var line in lines) {
      Console.WriteLine(line);
    }
  }
}
String.Splitメソッドを使って指定した区切り文字列で文字列を分割する
Imports System

Class Sample
  Shared Sub Main()
    Dim s As String = "The quick brown" + vbCrLf + "fox jumps over" + vbCrLf + "the lazy dog"
    Dim lines As String() = s.Split(vbCrLf) ' 改行の文字列vbCrLfを区切りとして文字列sを分割

    For Each line As String In lines
      Console.WriteLine(line)
    Next
  End Sub
End Class
実行結果
The quick brown
fox jumps over
the lazy dog

String.Splitメソッドでは、区切りとなる文字または文字列を複数指定することもできます。 この場合、どれか一つに一致する箇所があれば、そこを区切りとして分割が行われます。

String.Splitメソッドを使って複数の区切り文字で文字列を分割する
using System;

class Sample {
  static void Main()
  {
    var s = "The quick\nbrown fox\tjumps over\rthe lazy dog";
    var phrases = s.Split(new[] {'\r', '\n', '\t'}); // CR/LF/TABを区切りとして文字列sを分割

    foreach (var phrase in phrases) {
      Console.WriteLine(phrase);
    }
  }
}
String.Splitメソッドを使って複数の区切り文字で文字列を分割する
Imports System

Class Sample
  Shared Sub Main()
    Dim s As String = "The quick" + vbLf + "brown fox" + vbTab + "jumps over" + vbCr + "the lazy dog"
    Dim phrases As String() = s.Split(New Char() { vbCr, vbLf, vbTab }) ' CR/LF/TABを区切りとして文字列sを分割

    For Each phrase As String In phrases
      Console.WriteLine(phrase)
    Next
  End Sub
End Class
実行結果
The quick
brown fox
jumps over
the lazy dog

String.Splitメソッドでは、分割時の動作オプションをStringSplitOptionsで指定することができます。

StringSplitOptionsでは、分割によって生じる空の要素を除外するRemoveEmptyEntries、分割によって生じる前後の空白を削除するTrimEntriesを指定することができます。 特に指定しない場合、StringSplitOptions.Noneを指定した場合は、デフォルトの動作となります。

正規表現を用いて分割を行いたい場合は、Regex.Splitメソッドを使用します。

空の要素の除外 (StringSplitOptions.RemoveEmptyEntries)

String.SplitメソッドStringSplitOptions.RemoveEmptyEntriesを指定すると、分割によって空の要素(長さ0の部分)が生じた場合に、それを除外することができます。

StringSplitOptions.RemoveEmptyEntriesを指定して空となる要素を除外して文字列を分割する
using System;

class Sample {
  static void Main()
  {
    var s = "field1,,field3,field4,"; // カンマ区切りの文字列(空のカラムを含む)

    // 文字','を区切りとして分割し、空の要素を除外する
    Console.WriteLine($"[{nameof(StringSplitOptions.RemoveEmptyEntries)}]");

    var fields = s.Split(',', StringSplitOptions.RemoveEmptyEntries);

    Console.WriteLine($"Length = {fields.Length}");

    foreach (var field in fields) {
      Console.WriteLine("<{0}>", field);
    }
    Console.WriteLine();

    // 文字','を区切りとして分割する (空の要素はそのままにする)
    Console.WriteLine($"[{nameof(StringSplitOptions.None)}]");

    fields = s.Split(',', StringSplitOptions.None);

    Console.WriteLine($"Length = {fields.Length}");

    foreach (var field in fields) {
      Console.WriteLine("<{0}>", field);
    }
  }
}
StringSplitOptions.RemoveEmptyEntriesを指定して空となる要素を除外して文字列を分割する
Imports System

Class Sample
  Shared Sub Main()
    Dim s As String = "field1,,field3,field4," ' カンマ区切りの文字列(空のカラムを含む)
    Dim fields As String()

    ' 文字','を区切りとして分割し、空の要素を除外する
    Console.WriteLine($"[{NameOf(StringSplitOptions.RemoveEmptyEntries)}]")

    fields = s.Split(","c, StringSplitOptions.RemoveEmptyEntries)

    Console.WriteLine($"Length = {fields.Length}")

    For Each field As String In fields
      Console.WriteLine("<{0}>", field)
    Next
    Console.WriteLine()

    ' 文字列","を区切りとして分割する (空の要素はそのままにする)
    Console.WriteLine($"[{NameOf(StringSplitOptions.None)}]")

    fields = s.Split(","c, StringSplitOptions.None)

    Console.WriteLine($"Length = {fields.Length}")

    For Each field As String In fields
      Console.WriteLine("<{0}>", field)
    Next
  End Sub
End Class
実行結果
[RemoveEmptyEntries]
Length = 3
<field1>
<field3>
<field4>

[None]
Length = 5
<field1>
<>
<field3>
<field4>
<>

前後の空白の削除 (StringSplitOptions.TrimEntries)

String.SplitメソッドStringSplitOptions.TrimEntriesを指定すると、分割によって各要素の前後に空白が生じる場合に、それを削除することができます。 これは、Splitメソッドで分割した後に個々の要素に対してString.Trimメソッドを呼び出し、前後の空白を削除するのと同じ動作となります。

StringSplitOptions.TrimEntriesは.NET 5以降で使用できます。

StringSplitOptions.TrimEntriesを指定して各要素の前後の空白を削除して文字列を分割する .NET 5
using System;

class Sample {
  static void Main()
  {
    var s = " field1,   field2 ,field3  "; // カンマ区切りの文字列(各カラムの前後に余白を含む)

    // 文字','を区切りとして分割し、各要素の前後の空白を除去する
    Console.WriteLine($"[{nameof(StringSplitOptions.TrimEntries)}]");

    var fields = s.Split(',', StringSplitOptions.TrimEntries);

    foreach (var field in fields) {
      Console.WriteLine("<{0}>", field);
    }
    Console.WriteLine();

    // 文字','を区切りとして分割する (各要素の前後の空白はそのままにする)
    Console.WriteLine($"[{nameof(StringSplitOptions.None)}]");

    fields = s.Split(',', StringSplitOptions.None);

    foreach (var field in fields) {
      Console.WriteLine("<{0}>", field);
    }
  }
}
StringSplitOptions.TrimEntriesを指定して各要素の前後の空白を削除して文字列を分割する .NET 5
Imports System

Class Sample
  Shared Sub Main()
    Dim s As String = " field1,   field2 ,field3  " ' カンマ区切りの文字列(各カラムの前後に余白を含む)
    Dim fields As String()

    ' 文字','を区切りとして分割し、各要素の前後の空白を除去する
    Console.WriteLine($"[{NameOf(StringSplitOptions.TrimEntries)}]")

    fields = s.Split(","c, StringSplitOptions.TrimEntries)

    For Each field As String In fields
      Console.WriteLine("<{0}>", field)
    Next
    Console.WriteLine()

    ' 文字列","を区切りとして分割する (各要素の前後の空白はそのままにする)
    Console.WriteLine($"[{NameOf(StringSplitOptions.None)}]")

    fields = s.Split(","c, StringSplitOptions.None)

    For Each field As String In fields
      Console.WriteLine("<{0}>", field)
    Next
  End Sub
End Class
実行結果
[TrimEntries]
<field1>
<field2>
<field3>

[None]
< field1>
<   field2 >
<field3  >

なお、このオプションではString.Trimメソッドと同様にChar.IsWhiteSpacetrueとなる空白文字が削除されます。 空白文字には改行文字等も含まれます。

結合 (Join)

String.Joinメソッドは配列の結合を行う静的メソッドで、結合時の区切り文字と配列を指定し、それらを結合した結果を返します。 区切り文字には空の文字列を指定することもできます。 (結果はString.Concatメソッドによる連結と同じになります)

String.Joinメソッドを使って文字列配列を一つの文字列に結合する
using System;

class Sample {
  static void Main()
  {
    var words = new string[] {"The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"};

    Console.WriteLine(String.Join(" ", words)); // 区切り文字を" "として結合
    Console.WriteLine(String.Join("<>", words)); // 区切り文字を"<>"として結合
    Console.WriteLine(String.Join(String.Empty, words)); // 区切り文字を空の文字列として結合(区切りを挟まずに結合)
  }
}
String.Joinメソッドを使って文字列配列を一つの文字列に結合する
Imports System

Class Sample
  Shared Sub Main()
    Dim words As String() = New String() {"The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"}

    Console.WriteLine(String.Join(" ", words)) ' 区切り文字を" "として結合
    Console.WriteLine(String.Join("<>", words)) ' 区切り文字を"<>"として結合
    Console.WriteLine(String.Join(String.Empty, words)) ' 区切り文字を空の文字列として結合(区切りを挟まずに結合)
  End Sub
End Class
実行結果
The quick brown fox jumps over the lazy dog
The<>quick<>brown<>fox<>jumps<>over<>the<>lazy<>dog
Thequickbrownfoxjumpsoverthelazydog

.NET Framework 4からは、IEnumerable<String>を引数にとるバージョンのString.Joinメソッドも用意されています。 これを利用するとListに格納されている複数の文字列を一つに結合するということがメソッド呼び出し一つで行えます。

String.Joinメソッドを使って複数の文字列(IEnumerable<String>)をまとめて結合する .NET Framework 4
using System;
using System.Collections.Generic;

class Sample {
  static void Main()
  {
    var l = new List<string>() {"The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"};

    // リストl内の文字列をすべて結合する
    Console.WriteLine(String.Join(", ", l));
  }
}
実行結果
The, quick, brown, fox, jumps, over, the, lazy, dog

余白の削除 (Trim, TrimEnd, TrimStart)

String.Trimメソッドは文字列の先頭と末尾にある空白文字を削除(トリミング)するメソッドです。 String.TrimStartメソッドでは先頭のみ、String.TrimEndメソッドでは末尾のみにある空白文字を削除します。

String.Trim・TrimStart・TrimEndメソッドを使って先頭と末尾の余白を削除する
using System;

class Sample {
  static void Main()
  {
    var s = "   The quick brown fox jumps over the lazy dog   ";

    Console.WriteLine("<{0}>", s);
    Console.WriteLine("<{0}>", s.Trim()); // 先頭と末尾にある空白文字を削除する
    Console.WriteLine("<{0}>", s.TrimStart()); // 先頭にある空白文字を削除する
    Console.WriteLine("<{0}>", s.TrimEnd()); // 末尾にある空白文字を削除する
  }
}
String.Trim・TrimStart・TrimEndメソッドを使って先頭と末尾の余白を削除する
Imports System

Class Sample
  Shared Sub Main()
    Dim s As String = "   The quick brown fox jumps over the lazy dog   "

    Console.WriteLine("<{0}>", s)
    Console.WriteLine("<{0}>", s.Trim()) ' 先頭と末尾にある空白文字を削除する
    Console.WriteLine("<{0}>", s.TrimStart()) ' 先頭にある空白文字を削除する
    Console.WriteLine("<{0}>", s.TrimEnd()) ' 末尾にある空白文字を削除する
  End Sub
End Class
実行結果
<   The quick brown fox jumps over the lazy dog   >
<The quick brown fox jumps over the lazy dog>
<The quick brown fox jumps over the lazy dog   >
<   The quick brown fox jumps over the lazy dog>

このメソッドでは、半角および全角のスペースやタブだけでなく、改行文字なども空白文字として扱われます。 .NET Framework 4以降では、Unicodeで空白文字と定義されている文字(Char.IsWhiteSpacetrueとなる文字)が空白文字として扱われます。 それ以前のバージョンでの空白文字の扱いなど詳細は.NET Frameworkのドキュメントを参照してください。


String.TrimTrimStartTrimEndの各メソッドは、削除する文字を明示的に指定することも出来ます。 半角空白だけ削除したいといった場合や、スペースや改行文字以外の文字を削除したい場合には、それらの削除したい文字を明示的に指定します。

String.Trim・TrimStart・TrimEndメソッドを使って先頭と末尾から指定した文字を削除する
using System;

class Sample {
  static void Main()
  {
    var s = "123abc456def7890";
    var numbers = new char[] {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; // 半角数字を削除対象とする

    Console.WriteLine(s);
    Console.WriteLine(s.Trim(numbers)); // 先頭と末尾にある数字を削除
    Console.WriteLine(s.TrimStart(numbers)); // 先頭にある数字を削除
    Console.WriteLine(s.TrimEnd(numbers)); // 末尾にある数字を削除
  }
}
String.Trim・TrimStart・TrimEndメソッドを使って先頭と末尾から指定した文字を削除する
Imports System

Class Sample
  Shared Sub Main()
    Dim s As String = "123abc456def7890"
    Dim numbers As Char() = New Char() {"0"c, "1"c, "2"c, "3"c, "4"c, "5"c, "6"c, "7"c, "8"c, "9"c} ' 半角数字を削除対象とする

    Console.WriteLine(s)
    Console.WriteLine(s.Trim(numbers)) ' 先頭と末尾にある数字を削除
    Console.WriteLine(s.TrimStart(numbers)) ' 先頭にある数字を削除
    Console.WriteLine(s.TrimEnd(numbers)) ' 末尾にある数字を削除
  End Sub
End Class
実行結果
123abc456def7890
abc456def
abc456def7890
123abc456def

複雑な文字種を削除対象として指定する場合は、正規表現のほうが適切な可能性があります。 正規表現を用いて削除する場合は文字列の先頭・末尾を表す正規表現要素Regex.Replaceメソッドを使って空の文字列に置き換えることで削除できます。

余白の挿入 (PadLeft, PadRight)

String.PadLeftメソッドは余白の挿入を行うメソッドで、指定された文字数になるように左側にスペースを挿入します。 String.PadRightメソッドはPadLeftメソッドとは逆に右側にスペースを挿入します。 指定された文字数より文字列の長さの方が大きい場合、スペースは挿入されません。 このメソッドを使うことで文字列を左寄せ・右寄せすることができます。

String.PadLeft・PadRightメソッドを使って指定した文字数となるように余白を挿入する
using System;

class Sample {
  static void Main()
  {
    var s = "foo";

    Console.WriteLine("<{0}>", s.PadLeft(6)); // 文字数が6になるように左側に余白を挿入
    Console.WriteLine("<{0}>", s.PadRight(6)); // 文字数が6になるように右側に余白を挿入
    Console.WriteLine("<{0}>", s.PadLeft(2)); // 文字数が2になるように左側に余白を挿入
    Console.WriteLine("<{0}>", s.PadRight(2)); // 文字数が2になるように右側に余白を挿入
  }
}
String.PadLeft・PadRightメソッドを使って指定した文字数となるように余白を挿入する
Imports System

Class Sample
  Shared Sub Main()
    Dim s As String = "foo"

    Console.WriteLine("<{0}>", s.PadLeft(6)) ' 文字数が6になるように左側に余白を挿入
    Console.WriteLine("<{0}>", s.PadRight(6)) ' 文字数が6になるように右側に余白を挿入
    Console.WriteLine("<{0}>", s.PadLeft(2)) ' 文字数が2になるように左側に余白を挿入
    Console.WriteLine("<{0}>", s.PadRight(2)) ' 文字数が2になるように右側に余白を挿入
  End Sub
End Class
実行結果
<   foo>
<foo   >
<foo>
<foo>

余白の挿入はあくまで文字数を基準に行われます。 文字種が全角か半角かといった考慮はされないため、「全角または半角n文字分となるよう余白を入れる」といった目的でこのメソッドを使うことはできません。

中寄せ(センタリング)を行うように余白を挿入するメソッドは用意されていないので、そういった場合には独自に実装する必要があります。 実装例は§.センタリングを参照してください。


String.PadLeftPadRightメソッドでは、余白として半角スペース以外の文字を挿入するように指定することも出来ます。

String.PadLeft・PadRightメソッドを使って指定した文字を余白として挿入する
using System;

class Sample {
  static void Main()
  {
    var s = "foo";

    Console.WriteLine("<{0}>", s.PadLeft(6, '*')); // 文字数が6になるように左側に'*'を挿入
    Console.WriteLine("<{0}>", s.PadRight(6, '-')); // 文字数が6になるように右側に'-'を挿入
  }
}
String.PadLeft・PadRightメソッドを使って指定した文字を余白として挿入する
Imports System

Class Sample
  Shared Sub Main()
    Dim s As String = "foo"

    Console.WriteLine("<{0}>", s.PadLeft(6, "*"c)) ' 文字数が6になるように左側に'*'を挿入
    Console.WriteLine("<{0}>", s.PadRight(6, "-"c)) ' 文字数が6になるように右側に'-'を挿入
  End Sub
End Class
実行結果
<***foo>
<foo--->

大文字化・小文字化 (ToUpper, ToLower, ToUpperInvariant, ToLowerInvariant)

String.ToUpperメソッドは文字列を大文字化するメソッド、String.ToLowerメソッドは文字列を小文字化するメソッドです。

ToUpperメソッドとToLowerメソッドは現在のスレッドの(もしくは引数で指定された)カルチャの規則に基づいて大文字化・小文字化しますが、String.ToUpperInvariantメソッドString.ToLowerInvariantメソッドインバリアントカルチャ(特定の文化圏や言語に依存しない)の規則に基づいて大文字化・小文字化します。

String.ToUpper・ToLowerメソッドを使って文字列を大文字化・小文字化する
using System;

class Sample {
  static void Main()
  {
    var s = "The Quick Brown Fox Jumps Over The Lazy Dog";

    Console.WriteLine(s);
    Console.WriteLine(s.ToUpper());
    Console.WriteLine(s.ToUpperInvariant());
    Console.WriteLine(s.ToLower());
    Console.WriteLine(s.ToLowerInvariant());
  }
}
String.ToUpper・ToLowerメソッドを使って文字列を大文字化・小文字化する
Imports System

Class Sample
  Shared Sub Main()
    Dim s As String = "The Quick Brown Fox Jumps Over The Lazy Dog"

    Console.WriteLine(s)
    Console.WriteLine(s.ToUpper())
    Console.WriteLine(s.ToUpperInvariant())
    Console.WriteLine(s.ToLower())
    Console.WriteLine(s.ToLowerInvariant())
  End Sub
End Class
実行結果
The Quick Brown Fox Jumps Over The Lazy Dog
THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
the quick brown fox jumps over the lazy dog
the quick brown fox jumps over the lazy dog

ToUpper/ToUpperInvariantToLower/ToLowerInvariantの違いは、大文字化・小文字化の際に参照される規則です。

例えば、トルコ語においては i の大文字は I(U+0049) ではなく İ(U+0131) で、I の小文字は i(U+0069) ではなく ı(U+0130) となるため、スレッドのカルチャがトルコ語の場合ToUpper/ToLowerの結果はToUpperInvariant/ToLowerInvariantと異なる結果となります。

String.ToUpper/ToUpperInvariantとToLower/ToLowerInvariantメソッドで異なる結果となる例
using System;
using System.Globalization;
using System.Threading;

class Sample {
  static void Main()
  {
    Console.WriteLine(Thread.CurrentThread.CurrentCulture);
    Console.WriteLine("i: {0} {1}", "i".ToUpperInvariant(), "i".ToUpper());
    Console.WriteLine("I: {0} {1}", "I".ToLowerInvariant(), "I".ToLower());

    // 現在のスレッドのカルチャをtr-TR(トルコ語/トルコ)に変更
    Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("tr-TR");

    Console.WriteLine(Thread.CurrentThread.CurrentCulture);
    Console.WriteLine("i: {0} {1}", "i".ToUpperInvariant(), "i".ToUpper());
    Console.WriteLine("I: {0} {1}", "I".ToLowerInvariant(), "I".ToLower());
  }
}
String.ToUpper/ToUpperInvariantとToLower/ToLowerInvariantメソッドで異なる結果となる例
Imports System
Imports System.Globalization
Imports System.Threading

Class Sample
  Shared Sub Main()
    Console.WriteLine(Thread.CurrentThread.CurrentCulture)
    Console.WriteLine("i: {0} {1}", "i".ToUpperInvariant(), "i".ToUpper())
    Console.WriteLine("I: {0} {1}", "I".ToLowerInvariant(), "I".ToLower())

    ' 現在のスレッドのカルチャをtr-TR(トルコ語/トルコ)に変更
    Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("tr-TR")

    Console.WriteLine(Thread.CurrentThread.CurrentCulture)
    Console.WriteLine("i: {0} {1}", "i".ToUpperInvariant(), "i".ToUpper())
    Console.WriteLine("I: {0} {1}", "I".ToLowerInvariant(), "I".ToLower())
  End Sub
End Class
実行結果
ja-JP
i: I I
I: i i
tr-TR
i: I İ
I: i ı

したがって、カルチャや変換規則を強く意識する必要がある場合はToUpper/ToLowerを用いる必要があります。 一方それ以外の多くの場合はToUpperInvariant/ToLowerInvariantで十分と言えます。 特に、単にASCIIの範囲の文字だけを大文字/小文字にしたいという目的であれば、カルチャと変換規則に影響されないToUpperInvariant/ToLowerInvariantのほうが適切かつパフォーマンス的にも優れると考えられます。

カルチャと変換規則については、カルチャによる動作の違いとインバリアントカルチャ §.文字列比較の規則・ソート順定義(CompareInfo)としてのCurrentCultureStringComparisonとStringComparerでも詳しく説明しています。 ToUpper/ToLowerメソッド以外でカルチャによって異なる動作となる場合については、カルチャによる動作の違いとインバリアントカルチャを参照してください。

書式化 (Format)

String.Formatメソッドは任意の引数を指定された書式に基づいて文字列化する静的メソッドです。

String.Formatメソッドを使って特定の書式に基づいて値を文字列化する
using System;

class Sample {
  static void Main()
  {
    var dateTimeValue = new DateTime(2010, 9, 14, 1, 2, 3);
    var s = String.Format("{1:r}   {0:D}   {0:D4}   {0:N4}", 72, dateTimeValue);

    Console.WriteLine(s);
  }
}
String.Formatメソッドを使って特定の書式に基づいて値を文字列化する
Imports System

Class Sample
  Shared Sub Main()
    Dim dateTimeValue As New DateTime(2010, 9, 14, 1, 2, 3)
    Dim s As String = String.Format("{1:r}   {0:D}   {0:D4}   {0:N4}", 72, dateTimeValue)

    Console.WriteLine(s)
  End Sub
End Class
実行結果
Tue, 14 Sep 2010 01:02:03 GMT   72   0072   72.0000

書式の詳細については書式指定子での解説を参照してください。

Char配列への変換 (ToCharArray, CopyTo)

String.ToCharArrayメソッドは文字列をChar配列へ変換するメソッドです。

String.ToCharArrayメソッドを使って文字列を文字(Char)の配列に変換する
using System;

class Sample {
  static void Main()
  {
    var s = "The quick brown fox jumps over the lazy dog";
    char[] chars;

    // 文字列sを文字(Char)の配列に変換する
    chars = s.ToCharArray();

    for (var i = 0; i < chars.Length; i++) {
      Console.Write(chars[i]);
    }

    Console.WriteLine();

    // 配列を反転することで文字の並びを逆にして表示
    Array.Reverse(chars);

    for (var i = 0; i < chars.Length; i++) {
      Console.Write(chars[i]);
    }

    Console.WriteLine();
  }
}
String.ToCharArrayメソッドを使って文字列を文字(Char)の配列に変換する
Imports System

Class Sample
  Shared Sub Main()
    Dim s As String = "The quick brown fox jumps over the lazy dog"
    Dim chars As Char()

    ' 文字列sを文字(Char)の配列に変換する
    chars = s.ToCharArray()

    For i As Integer = 0 To chars.Length - 1
      Console.Write(chars(i))
    Next

    Console.WriteLine()

    ' 配列を反転することで文字の並びを逆にして表示
    Array.Reverse(chars)

    For i As Integer = 0 To chars.Length - 1
      Console.Write(chars(i))
    Next

    Console.WriteLine()
  End Sub
End Class
実行結果
The quick brown fox jumps over the lazy dog
god yzal eht revo spmuj xof nworb kciuq ehT

バイト配列への変換、特に文字コードを指定してバイト配列へ変換する方法についてはテキスト変換・フォーマット変換 §.文字コードあるいはバイト列操作 §.文字列とバイト列の相互変換 (Encoding)を参照してください。


String.CopyToメソッドは、文字列の一部のみを別のChar配列にコピーするメソッドです。 ToCharArrayメソッドとは異なり、コピー先のChar配列をあらかじめ用意しておく必要があります。

String.CopyToメソッドを使って文字列の一部を文字(Char)の配列に変換してコピーする
using System;

class Sample {
  static void Main()
  {
    var s = "The quick brown fox jumps over the lazy dog";
    var chars = new char[11]; // コピー先となる配列

    s.CopyTo(4, chars, 0, 11); // 文字列の4文字目から11文字分を、コピー先配列のインデックス0を起点にコピー

    // コピーしたものを一文字ずつ表示
    for (var i = 0; i < chars.Length; i++) {
      Console.Write("{0}/", chars[i]);
    }

    Console.WriteLine();
  }
}
String.CopyToメソッドを使って文字列の一部を文字(Char)の配列に変換してコピーする
Imports System

Class Sample
  Shared Sub Main()
    Dim s As String = "The quick brown fox jumps over the lazy dog"
    Dim chars(10) As Char ' コピー先となる配列

    s.CopyTo(4, chars, 0, 11) ' 文字列の4文字目から11文字分を、コピー先配列のインデックス0を起点にコピー

    ' コピーしたものを一文字ずつ表示
    For i As Integer = 0 To chars.Length - 1
      Console.Write("{0}/", chars(i))
    Next

    Console.WriteLine()
  End Sub
End Class
実行結果
q/u/i/c/k/ /b/r/o/w/n/

Char配列からの変換 (Stringコンストラクタ)

StringクラスのコンストラクタにChar配列を指定することにより、Char配列から文字列へ変換することが出来ます。

Stringコンストラクタを使ってChar配列から文字列を作成する
using System;

class Sample {
  static void Main()
  {
    var chars = new char[] {'b', 'a', 'r'}; // 文字列を構成する文字の配列
    var s = new string(chars); // 文字の配列から文字列を作成する

    Console.WriteLine(s);

    Array.Reverse(chars);

    Console.WriteLine(new string(chars));
  }
}
Stringコンストラクタを使ってChar配列から文字列を作成する
Imports System

Class Sample
  Shared Sub Main()
    Dim chars As Char() = New Char() {"b"c, "a"c, "r"c} ' 文字列を構成する文字の配列
    Dim s As New String(chars) ' 文字の配列から文字列を作成する

    Console.WriteLine(s)

    Array.Reverse(chars)

    Console.WriteLine(New String(chars))
  End Sub
End Class
実行結果
bar
rab

マネージドコードのみの場合はほとんど使うことはありませんが、Stringコンストラクタではcharのポインタやsbyteのポインタから文字列を作成することも出来ます。

charポインタ・sbyteポインタから文字列を作成する
using System;
using System.Text;

class Sample {
  static void Main()
  {
    byte[] data;
    string s;

    // 文字列を構成するbyte配列
    data = new byte[] {0x41, 0x42, 0x43};

    unsafe {
      fixed (byte* d = data) {
        // byteポインタをsbyteポインタにキャストして文字列を作成する
        s = new string((sbyte*)d, 0, 3);
      }
    }

    Console.WriteLine(s);

    data = new byte[] {0x93, 0xfa, 0x96, 0x7b, 0x8c, 0xea};

    unsafe {
      fixed (byte* d = data) {
        // sbyteポインタから文字列を作成する (文字コードをshift_jisとして解釈する)
        s = new string((sbyte*)d, 0, 6, Encoding.GetEncoding("shift_jis"));
      }
    }

    Console.WriteLine(s);
  }
}
実行結果
ABC
日本語

Stringクラスで提供されない操作

ここではStringクラスで提供されない文字列操作と、それを実装する例を見ていきます。 以下の例では引数のチェック等は省略しています。

部分文字列の計上 (Count)

Stringクラスでは文字列中に含まれる部分文字列の数(同じ文字列がいくつ含まれているか)を計上するメソッドは用意されていません。 以下は部分文字列の計上を行う例です。 Count1ではIndexOfメソッドを用いて部分文字列の探索を繰り返すことで数を計上しています。 Count2ではReplaceメソッドを用いて部分文字列を削除し、減った文字数をもとに計上しています。

文字列に含まれる部分文字列を計上する(Count)
using System;

class Sample {
  static int Count1(string s, string substr)
  {
    for (int count = 0, lastIndex = 0;; count++) {
      int index = s.IndexOf(substr, lastIndex);

      if (index < 0) {
        return count;
      }
      else {
        lastIndex = index + substr.Length;
      }
    }
  }

  static int Count2(string s, string substr)
  {
    return (s.Length - s.Replace(substr, null).Length) / substr.Length;
  }

  static void Main()
  {
    var s = "かごめかごめ かごのなかのとりは いついつでやる";

    Console.WriteLine(s);
    Console.WriteLine(Count1(s, "かご"));
    Console.WriteLine(Count2(s, "かご"));
    Console.WriteLine(Count1(s, "いつ"));
    Console.WriteLine(Count2(s, "いつ"));
    Console.WriteLine(Count1(s, "か"));
    Console.WriteLine(Count2(s, "か"));
  }
}
文字列に含まれる部分文字列を計上する(Count)
Imports System

Class Sample
  Shared Function Count1(ByVal s As String, ByVal substr As String) As Integer
    Dim count As Integer = 0
    Dim lastIndex As Integer = 0

    Do
      Dim index As Integer = s.IndexOf(substr, lastIndex)

      If index < 0 Then
        Return count
      Else
        count += 1
        lastIndex = index + substr.Length
      End If
    Loop
  End Function

  Shared Function Count2(ByVal s As String, ByVal substr As String) As Integer
    Return (s.Length - s.Replace(substr, Nothing).Length) \ substr.Length
  End Function

  Shared Sub Main()
    Dim s As String = "かごめかごめ かごのなかのとりは いついつでやる"

    Console.WriteLine(s)
    Console.WriteLine(Count1(s, "かご"))
    Console.WriteLine(Count2(s, "かご"))
    Console.WriteLine(Count1(s, "いつ"))
    Console.WriteLine(Count2(s, "いつ"))
    Console.WriteLine(Count1(s, "か"))
    Console.WriteLine(Count2(s, "か"))
  End Sub
End Class
実行結果
かごめかごめ かごのなかのとりは いついつでやる
3
3
2
2
4
4

反転 (Reverse)

Stringクラスでは文字列の並びを反転するメソッドは用意されていません。 以下は文字列の反転を行う例です。 ToCharArrayメソッドを用いて一度Char配列にしてから、Array.Reverseメソッドにより反転したのちに再びStringに変換することで文字列の反転を実現しています。

文字列中の文字の並びを反転する(Reverse)
using System;

class Sample {
  static string Reverse(string s)
  {
    var chars = s.ToCharArray();

    Array.Reverse(chars);

    return new string(chars);
  }

  static void Main()
  {
    var s1 = "The quick brown fox jumps over the lazy dog";
    var s2 = "かごめかごめ かごのなかのとりは いついつでやる";

    Console.WriteLine(s1);
    Console.WriteLine(Reverse(s1));

    Console.WriteLine(s2);
    Console.WriteLine(Reverse(s2));
  }
}
文字列中の文字の並びを反転する(Reverse)
Imports System

Class Sample
  Shared Function Reverse(ByVal s As String) As String
    Dim chars As Char() = s.ToCharArray()

    Array.Reverse(chars)

    Return New String(chars)
  End Function

  Shared Sub Main()
    Dim s1 As String = "The quick brown fox jumps over the lazy dog"
    Dim s2 As String = "かごめかごめ かごのなかのとりは いついつでやる"

    Console.WriteLine(s1)
    Console.WriteLine(Reverse(s1))

    Console.WriteLine(s2)
    Console.WriteLine(Reverse(s2))
  End Sub
End Class
実行結果
The quick brown fox jumps over the lazy dog
god yzal eht revo spmuj xof nworb kciuq ehT
かごめかごめ かごのなかのとりは いついつでやる
るやでついつい はりとのかなのごか めごかめごか

文字列にサロゲートペアが含まれている場合、上記の方法は正しく動作しません。


文字列の反転は、LINQを用いて次のように実装することもできます。

文字列中の文字の並びを反転する(Reverse)・LINQ版
using System;
using System.Linq;

class Sample {
  static void Main()
  {
    var s = "かごめかごめ かごのなかのとりは いついつでやる";
    var r = new String(s.Reverse().ToArray());

    Console.WriteLine(s);
    Console.WriteLine(r);
  }
}
文字列中の文字の並びを反転する(Reverse)・LINQ版
Imports System
Imports System.Linq

Class Sample
  Shared Sub Main()
    Dim s As String = "かごめかごめ かごのなかのとりは いついつでやる"
    Dim r As New String(s.Reverse().ToArray())

    Console.WriteLine(s)
    Console.WriteLine(r)
  End Sub
End Class
実行結果
かごめかごめ かごのなかのとりは いついつでやる
るやでついつい はりとのかなのごか めごかめごか

文字列にサロゲートペアが含まれている場合、上記の方法は正しく動作しません。

範囲を指定した置換

Replaceメソッドでは、文字列の範囲を指定して別の文字列に置き換えることはできません。 そういった置換を行う場合は、Substringメソッドで文字列を切り出したあと置き換えたい文字列と連結するようにします。 次の例では、位置を指定して文字列の一部分を置き換えるReplaceメソッドを作成しています。

文字列中の指定した範囲を別の文字列に置換する
using System;

class Sample {
  // 文字列strのstart文字目からlength文字分をnewstrに置き換えるメソッド
  static string Replace(string str, int start, int length, string newstr)
  {
    return str.Substring(0, start) + newstr + str.Substring(start + length);
  }

  static void Main()
  {
    var s = "The quick brown fox jumps over the lazy dog";

    Console.WriteLine(s);
    Console.WriteLine(Replace(s, 4, 5, "clever")); // 4文字目から5文字分を"clever"に置き換え
  }
}
文字列中の指定した範囲を別の文字列に置換する
Imports System

Class Sample
  ' 文字列strのstart文字目からlength文字分をnewstrに置き換えるメソッド
  Shared Function Replace(ByVal str As String, ByVal start As Integer, ByVal length As Integer, ByVal newstr As String) As String
    Return str.Substring(0, start) + newstr + str.Substring(start + length)
  End Function

  Shared Sub Main()
    Dim s As String = "The quick brown fox jumps over the lazy dog"

    Console.WriteLine(s)
    Console.WriteLine(Replace(s, 4, 5, "clever")) ' 4文字目から5文字分を"clever"に置き換え
  End Sub
End Class
実行結果
The quick brown fox jumps over the lazy dog
The clever brown fox jumps over the lazy dog

センタリング

StringクラスではPadLeft・PadRightによる左詰め・右詰めは行えますが、文字列の中寄せ(センタリング)を行うメソッドは用意されていません。 以下は文字列のセンタリングを行う例です。 指定された幅で文字列が中央に来るよう左右に空白を入れています。 文字数よりも幅が下回る場合はそのままにします。

文字幅を指定して文字列を中寄せ・センタリングする
using System;

class Sample {
  static string Center(string s, int width)
  {
    var margin = (width - s.Length) / 2;

    if (margin <= 0) {
      return s;
    }
    else {
      var padding = new String(' ', margin);

      return String.Concat(padding, s, padding);
    }
  }

  static void Main()
  {
    var s = "foo";

    Console.WriteLine("<{0}>", Center(s, 5));
    Console.WriteLine("<{0}>", Center(s, 6));
    Console.WriteLine("<{0}>", Center(s, 10));
    Console.WriteLine("<{0}>", Center(s, 20));
    Console.WriteLine("<{0}>", Center(s, 0));
  }
}
文字幅を指定して文字列を中寄せ・センタリングする
Imports System

Class Sample
  Shared Function Center(ByVal s As String, ByVal width As Integer) As String
    Dim margin As Integer = (width - s.Length) \ 2

    If margin <= 0 Then
      Return s
    Else
      Dim padding As New String(" "c, margin)

      Return String.Concat(padding, s, padding)
    End If
  End Function

  Shared Sub Main()
    Dim s As String = "foo"

    Console.WriteLine("<{0}>", Center(s, 5))
    Console.WriteLine("<{0}>", Center(s, 6))
    Console.WriteLine("<{0}>", Center(s, 10))
    Console.WriteLine("<{0}>", Center(s, 20))
    Console.WriteLine("<{0}>", Center(s, 0))
  End Sub
End Class
実行結果
< foo >
< foo >
<   foo   >
<        foo        >
<foo>

乗算演算子(*, *=)・繰り返した文字列の生成

Stringクラスでは乗算演算子はサポートされていません。 いくつかの言語では、乗算演算子を使って同じ文字の並びを任意の回数だけ繰り返した文字列を作ることが出来ますが、Stringクラスではそういった操作は用意されていません。 またString.Repeatのようなメソッドも用意されていません。 そのため、必要な回数だけ連結を繰り返すなどして作成する必要があります。

同じ文字列を繰り返した文字列を作成する(Repeat)
using System;

class Sample {
  static void Main()
  {
    // string s = "foo" * 10;
    var s = string.Empty;

    for (var i = 0; i < 10; i++) {
      s += "foo";
    }

    Console.WriteLine(s);
  }
}
同じ文字列を繰り返した文字列を作成する(Repeat)
Imports System

Class Sample
  Shared Sub Main()
    ' Dim s As String = "foo" * 10
    Dim s As String = String.Empty

    For i As Integer = 1 To 10
      s += "foo"
    Next

    Console.WriteLine(s)
  End Sub
End Class
実行結果
foofoofoofoofoofoofoofoofoofoo

この方法で長大な文字列を生成する場合は、パフォーマンスの観点からStringBuilderクラスを使うことも検討してください。


Stringクラスのコンストラクタを使うことで、同じ文字(1文字)を任意の回数だけ繰り替えした文字を作ることが出来ます。 この方法は1文字以上の文字列に対して用いることはできません。

同じ文字を繰り返した文字列を作成する(Repeat)
using System;

class Sample {
  static void Main()
  {
    var s = new string('あ', 10); // 'あ'を10回くりかえした文字列を作る

    Console.WriteLine(s);
  }
}
同じ文字を繰り返した文字列を作成する(Repeat)
Imports System

Class Sample
  Shared Sub Main()
    Dim s As New String("あ"c, 10) ' "あ"を10回くりかえした文字列を作る

    Console.WriteLine(s)
  End Sub
End Class
実行結果
ああああああああああ

LINQのEnumerable.Repeatメソッドを用いることにより、任意の文字列を繰り返した文字列を作成することができます。

同じ文字列を繰り返した文字列を作成する(Repeat)・LINQ版
using System;
using System.Linq;

class Sample {
  static void Main()
  {
    // "あいう"を10回くりかえした文字列を作る
    var s = string.Concat(Enumerable.Repeat("あいう", 10));

    Console.WriteLine(s);
  }
}
同じ文字列を繰り返した文字列を作成する(Repeat)・LINQ版
Imports System
Imports System.Linq

Class Sample
  Shared Sub Main()
    ' "あいう"を10回くりかえした文字列を作る
    Dim s As String = String.Concat(Enumerable.Repeat("あいう", 10))

    Console.WriteLine(s)
  End Sub
End Class
実行結果
あいうあいうあいうあいうあいうあいうあいうあいうあいうあいう

VBの文字列操作関数

(このドキュメントは未整理です)

現在はあまり推奨されませんが、Microsoft.VisualBasic名前空間のStringsクラスのメソッドを使うことで、VB由来の文字列操作関数を使うことも出来ます。 VB.NETでもこれらの関数を使うことは出来ますが、新規に書くコードではできるだけStringクラスのメソッドを使うべきです。 これらの文字列操作関数ではインデックスが1から始まる(1-based)として扱われる一方、.NET Frameworkでは0から始まる(0-based)として扱われるため、混乱を招いたり意図しない動作となる可能性があります。

C#でVBの文字列操作関数を使う
using System;
using Microsoft.VisualBasic;

class Sample {
  static void Main()
  {
    Console.WriteLine("<{0}>", Strings.LTrim("   foo"));
    Console.WriteLine("<{0}>", Strings.RTrim("foo   "));
    Console.WriteLine(Strings.UCase("foo"));
    Console.WriteLine(Strings.LCase("FOO"));
    Console.WriteLine(Strings.Mid("The quick brown fox jumps over the lazy dog", 1, 9)); // '1'文字目から9文字分を取得する
    Console.WriteLine("The quick brown fox jumps over the lazy dog".Substring(0, 9)); // '0'文字目から9文字分を取得する
    Console.WriteLine(Strings.InStr("The quick brown fox", "FOX", CompareMethod.Binary));
    Console.WriteLine(Strings.InStr("The quick brown fox", "FOX", CompareMethod.Text));
    Console.WriteLine("The quick brown fox".IndexOf("FOX"));
    Console.WriteLine("The quick brown fox".IndexOf("FOX", StringComparison.CurrentCultureIgnoreCase));
  }
}
実行結果
<foo>
<foo>
FOO
foo
The quick
The quick
0
17
-1
16