ここでは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クラスのメソッド | 解説へのリンク |
上記以外のメソッドやここでは扱わない事項・関連する事項に関しては以下を参照してください。
- 部分文字列の検索や文字列同士の比較など、文字列の探索や比較については文字列の探索・比較を参照してください。
- 大文字小文字の違いなどの文字列の探索・比較時のオプション、カルチャの規則に基づいた比較・ロケール(カルチャ)によって動作が変わる場合とそれに依存しない方法など、文字と文字列の比較規則に関する詳細については文字列と比較オプション・カルチャの並べ替え規則を参照してください。
- Stringクラスでは正規表現などのパターンマッチングによる文字列操作は直接はサポートされません。 正規表現を使った文字列操作については正規表現によるパターンマッチングと文字列操作を参照してください。
- この文章ではUnicode正規形や正規化、サロゲートペアを含む文字列の扱いについては踏み込みません。 そういった要素を含む文字列の処理に関しては別途他のドキュメントを参照してください。
文字列の加工・編集
連結 (Concat, +, +=)
String.Concatメソッドは文字列同士の連結を行う静的メソッドで、任意の数の文字列を連結出来ます。 またC#、VBでは加算演算子+
、および複合代入の加算演算子+=
を使った連結もできるようになっています。
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);
}
}
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に格納されている複数の文字列を一つに連結するということがメソッド呼び出し一つで行えます。
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メソッドでは指定された文字列と同じ内容の新しいインスタンスが作成される点が異なります。
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は同一の文字列だが異なるインスタンスへの参照となる
}
}
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メソッドは文字列から部分文字列を切り出すメソッドで、切り出す最初のインデックスと長さを指定することで文字列の一部分を取得します。 長さを指定しなかった場合は、指定されたインデックスから文字列の最後までが返されます。
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文字目以降を切り出す
}
}
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メソッドは別の文字列を挿入した結果を返します。
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 "を挿入
}
}
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メソッドは文字列の一部分を削除した文字列を取得するメソッドで、削除を始める最初のインデックスと長さを指定することで文字列の一部分を削除します。 長さを指定しなかった場合は、指定されたインデックスから文字列の最後までが削除されます。
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文字目以降を削除
}
}
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メソッドは文字列内の部分文字列を別の部分文字列に置き換えるメソッドです。 一致する文字列はすべて置き換えられます。
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"に置き換え
}
}
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)を指定すると、置き換え前の部分文字列を削除することが出来ます。
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 "を削除
}
}
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)単位での置換も行えます。
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に置換
}
}
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
)または文字列を指定し、それを区切りとして分割した結果を文字列の配列で返します。
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);
}
}
}
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
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);
}
}
}
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メソッドでは、区切りとなる文字または文字列を複数指定することもできます。 この場合、どれか一つに一致する箇所があれば、そこを区切りとして分割が行われます。
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);
}
}
}
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の部分)が生じた場合に、それを除外することができます。
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);
}
}
}
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以降で使用できます。
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);
}
}
}
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.IsWhiteSpaceがtrueとなる空白文字が削除されます。 空白文字には改行文字等も含まれます。
結合 (Join)
String.Joinメソッドは配列の結合を行う静的メソッドで、結合時の区切り文字と配列を指定し、それらを結合した結果を返します。 区切り文字には空の文字列を指定することもできます。 (結果はString.Concatメソッドによる連結と同じになります)
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)); // 区切り文字を空の文字列として結合(区切りを挟まずに結合)
}
}
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に格納されている複数の文字列を一つに結合するということがメソッド呼び出し一つで行えます。
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メソッドでは末尾のみにある空白文字を削除します。
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()); // 末尾にある空白文字を削除する
}
}
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.IsWhiteSpaceがtrueとなる文字)が空白文字として扱われます。 それ以前のバージョンでの空白文字の扱いなど詳細は.NET Frameworkのドキュメントを参照してください。
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)); // 末尾にある数字を削除
}
}
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メソッドとは逆に右側にスペースを挿入します。 指定された文字数より文字列の長さの方が大きい場合、スペースは挿入されません。 このメソッドを使うことで文字列を左寄せ・右寄せすることができます。
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になるように右側に余白を挿入
}
}
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.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になるように右側に'-'を挿入
}
}
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メソッドはインバリアントカルチャ(特定の文化圏や言語に依存しない)の規則に基づいて大文字化・小文字化します。
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());
}
}
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
/ToUpperInvariant
とToLower
/ToLowerInvariant
の違いは、大文字化・小文字化の際に参照される規則です。
例えば、トルコ語においては i の大文字は I(U+0049) ではなく İ(U+0131) で、I の小文字は i(U+0069) ではなく ı(U+0130) となるため、スレッドのカルチャがトルコ語の場合ToUpper
/ToLower
の結果はToUpperInvariant
/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());
}
}
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)としてのCurrentCultureやStringComparisonとStringComparerでも詳しく説明しています。 ToUpper/ToLowerメソッド以外でカルチャによって異なる動作となる場合については、カルチャによる動作の違いとインバリアントカルチャを参照してください。
書式化 (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);
}
}
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配列へ変換するメソッドです。
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();
}
}
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配列をあらかじめ用意しておく必要があります。
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();
}
}
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配列から文字列へ変換することが出来ます。
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));
}
}
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のポインタから文字列を作成することも出来ます。
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メソッドを用いて部分文字列を削除し、減った文字数をもとに計上しています。
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, "か"));
}
}
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に変換することで文字列の反転を実現しています。
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));
}
}
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を用いて次のように実装することもできます。
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);
}
}
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のようなメソッドも用意されていません。 そのため、必要な回数だけ連結を繰り返すなどして作成する必要があります。
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);
}
}
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文字以上の文字列に対して用いることはできません。
using System;
class Sample {
static void Main()
{
var s = new string('あ', 10); // 'あ'を10回くりかえした文字列を作る
Console.WriteLine(s);
}
}
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メソッドを用いることにより、任意の文字列を繰り返した文字列を作成することができます。
using System;
using System.Linq;
class Sample {
static void Main()
{
// "あいう"を10回くりかえした文字列を作る
var s = string.Concat(Enumerable.Repeat("あいう", 10));
Console.WriteLine(s);
}
}
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)として扱われるため、混乱を招いたり意図しない動作となる可能性があります。
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