DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

文字列を削除する

ここでは、例えば「あいうえお」の2文字目から3文字削除して「あお」にするように、文字列内の指定した位置から指定した長さを削除する方法を紹介します。また、「あうえおうえい」から「うえ」を削除して「あおい」にするように、文字列内の指定した文字列を削除する方法も紹介します。

なお、文字列から指定した文字を削除する方法は「文字列から指定した文字を削除する」で説明しています。

文字列内の指定した位置から指定した長さを削除する

String.Removeメソッド

文字列内の指定した位置から指定した長さを削除するには、String.Removeメソッドを使います。

細かい説明は後にして、まずは具体例を紹介します。

VB.NET
コードを隠すコードを選択
Dim s As String = "あいうえおかきくけこ"

'先頭から5文字を削除する
Dim s1 As String = s.Remove(0, 5)
'かきくけこ

'2文字目(インデックスは1)から3文字を削除する
Dim s2 As String = s.Remove(1, 3)
'あおかきくけこ

'6文字目から最後まで削除する
Dim s3 As String = s.Remove(5)
'あいうえお
C#
コードを隠すコードを選択
string s = "あいうえおかきくけこ";

//先頭から5文字を削除する
string s1 = s.Remove(0, 5);
//かきくけこ

//2文字目(インデックスは1)から3文字を削除する
string s2 = s.Remove(1, 3);
//あおかきくけこ

//6文字目から最後まで削除する
string s3 = s.Remove(5);
//あいうえお

String.Removeメソッドは削除した結果の文字列を返すだけで、基の文字列は変更しません。上の例で言えば、Removeメソッドを呼び出した後も変数 s の値は"あいうえおかきくけこ"のままです。

String.Substringメソッド

指定した部分を削除するということは、削除する以外の部分を取得して結合することと同じです。よってString.Removeメソッドと同じことをString.Substringメソッドを使ってもできます。特に先頭または末尾の文字列を削除する場合は、String.Substringメソッドでも文字列を結合する必要がありませんので、どちらを使ってもほとんど同じです。

先程のString.Removeメソッドの例をString.Substringメソッドを使って書き換えたコードを以下に示します。

VB.NET
コードを隠すコードを選択
Dim s As String = "あいうえおかきくけこ"

'先頭から5文字を削除する(6文字目以降を取得する)
Dim s1 As String = s.Substring(5)
'かきくけこ

'2文字目から3文字を削除する(はじめの1文字と、5文字目以降を結合する)
Dim s2 As String = s.Substring(0, 1) & s.Substring(4)
'あおかきくけこ

'6文字目から最後まで削除する(先頭から5文字を取得する)
Dim s3 As String = s.Substring(0, 5)
'あいうえお
C#
コードを隠すコードを選択
string s = "あいうえおかきくけこ";

//先頭から5文字を削除する(6文字目以降を取得する)
string s1 = s.Substring(5);
//かきくけこ

//2文字目から3文字を削除する(はじめの1文字と、5文字目以降を結合する)
string s2 = s.Substring(0, 1) + s.Substring(4);
//あおかきくけこ

//6文字目から最後まで削除する(先頭から5文字を取得する)
string s3 = s.Substring(0, 5);
//あいうえお

RemoveとSubstringのパフォーマンスの比較

実はRemoveメソッドのパラメータが1つのオーバーロードは、内部でSubstringメソッドを呼び出しています。よってこの場合は、直接Substringを呼び出した方が効率的と考えられます。実際「C# Remove String Usage」によると、文字列の末尾から数文字削除する場合、RemoveよりもSubstringの方が速いということです。

私自身も以下のようなコードでRemoveとSubstringのどちらが速いかを比べてみました。すると、先頭の数文字を削除する場合はSubstringの方が若干速いようでしたが、末尾の数文字を削除する場合はほとんど差がありませんでした。真ん中の数文字を削除する場合は、Removeの方が明らかに速かったです。

なおこの結果は私が簡単に試行してみた限りの結果ですので、正確ではないかもしれないことをご了承ください。

VB.NET
コードを隠すコードを選択
Dim stringLength As Integer = 10000000
Dim loopCount As Integer = 500

Dim sw1 As New System.Diagnostics.Stopwatch()
Dim s1 As New String("0"c, stringLength)
sw1.Start()
For i As Integer = 0 To loopCount - 1
    '先頭の10文字を削除する
    s1 = s1.Remove(0, 10)
Next
sw1.Stop()
Console.WriteLine(sw1.ElapsedTicks)
'19282626

Dim sw2 As New System.Diagnostics.Stopwatch()
Dim s2 As New String("0"c, stringLength)
sw2.Start()
For i As Integer = 0 To loopCount - 1
    '先頭の10文字を削除する
    s2 = s2.Substring(10)
Next
sw2.Stop()
Console.WriteLine(sw2.ElapsedTicks)
'18617120

Dim sw3 As New System.Diagnostics.Stopwatch()
Dim s3 As New String("0"c, stringLength)
sw3.Start()
For i As Integer = 0 To loopCount - 1
    '末尾の10文字を削除する
    s3 = s3.Remove(s3.Length - 10)
Next
sw3.Stop()
Console.WriteLine(sw3.ElapsedTicks)
'18642552

Dim sw4 As New System.Diagnostics.Stopwatch()
Dim s4 As New String("0"c, stringLength)
sw4.Start()
For i As Integer = 0 To loopCount - 1
    '末尾の10文字を削除する
    s4 = s4.Substring(0, s4.Length - 10)
Next
sw4.Stop()
Console.WriteLine(sw4.ElapsedTicks)
'18632454

Dim sw5 As New System.Diagnostics.Stopwatch()
Dim s5 As New String("0"c, stringLength)
sw5.Start()
For i As Integer = 0 To loopCount - 1
    '中間の10文字を削除する
    s5 = s5.Remove(10, 10)
Next
sw5.Stop()
Console.WriteLine(sw5.ElapsedTicks)
'19126468

Dim sw6 As New System.Diagnostics.Stopwatch()
Dim s6 As New String("0"c, stringLength)
sw6.Start()
For i As Integer = 0 To loopCount - 1
    '中間の10文字を削除する
    s6 = s6.Substring(0, 10) & s6.Substring(20)
Next
sw6.Stop()
Console.WriteLine(sw6.ElapsedTicks)
'37596921
C#
コードを隠すコードを選択
int stringLength = 10000000;
int loopCount = 500;

System.Diagnostics.Stopwatch sw1 = new System.Diagnostics.Stopwatch();
string s1 = new string('0', stringLength);
sw1.Start();
for (int i = 0; i < loopCount; i++)
{
    //先頭の10文字を削除する
    s1 = s1.Remove(0, 10);
}
sw1.Stop();
Console.WriteLine(sw1.ElapsedTicks);
//19282626

System.Diagnostics.Stopwatch sw2 = new System.Diagnostics.Stopwatch();
string s2 = new string('0', stringLength);
sw2.Start();
for (int i = 0; i < loopCount; i++)
{
    //先頭の10文字を削除する
    s2 = s2.Substring(10);
}
sw2.Stop();
Console.WriteLine(sw2.ElapsedTicks);
//18617120

System.Diagnostics.Stopwatch sw3 = new System.Diagnostics.Stopwatch();
string s3 = new string('0', stringLength);
sw3.Start();
for (int i = 0; i < loopCount; i++)
{
    //末尾の10文字を削除する
    s3 = s3.Remove(s3.Length - 10);
}
sw3.Stop();
Console.WriteLine(sw3.ElapsedTicks);
//18642552

System.Diagnostics.Stopwatch sw4 = new System.Diagnostics.Stopwatch();
string s4 = new string('0', stringLength);
sw4.Start();
for (int i = 0; i < loopCount; i++)
{
    //末尾の10文字を削除する
    s4 = s4.Substring(0, s4.Length - 10);
}
sw4.Stop();
Console.WriteLine(sw4.ElapsedTicks);
//18632454

System.Diagnostics.Stopwatch sw5 = new System.Diagnostics.Stopwatch();
string s5 = new string('0', stringLength);
sw5.Start();
for (int i = 0; i < loopCount; i++)
{
    //中間の10文字を削除する
    s5 = s5.Remove(10, 10);
}
sw5.Stop();
Console.WriteLine(sw5.ElapsedTicks);
//19126468

System.Diagnostics.Stopwatch sw6 = new System.Diagnostics.Stopwatch();
string s6 = new string('0', stringLength);
sw6.Start();
for (int i = 0; i < loopCount; i++)
{
    //中間の10文字を削除する
    s6 = s6.Substring(0, 10) + s6.Substring(20);
}
sw6.Stop();
Console.WriteLine(sw6.ElapsedTicks);
//37596921

StringBuilder.Removeメソッド

Stringクラスと同様に、StringBuilder.Removeメソッドでも文字列を削除できます。StringBuilder.RemoveがString.Removeと違うのは、パラメータが1つのオーバーロードがないことと、StringBuilderオブジェクトそのものが変更される点です。

以下にStringBuilder.Removeを使用した例を示します。

VB.NET
コードを隠すコードを選択
Dim s As String = "あいうえおかきくけこさしすせそ"

'StringBuilderの作成
Dim sb As New System.Text.StringBuilder(s)

'先頭から5文字を削除する
sb.Remove(0, 5)
'この時点でsbは「かきくけこさしすせそ」

'2文字目から3文字を削除する
sb.Remove(1, 3)
'この時点でsbは「かこさしすせそ」

'6文字目から最後まで削除する
sb.Remove(5, sb.Length - 5)
'この時点でsbは「かこさしす」

Dim r As String = sb.ToString()
'かこさしす
C#
コードを隠すコードを選択
string s = "あいうえおかきくけこさしすせそ";

//StringBuilderの作成
System.Text.StringBuilder sb = new System.Text.StringBuilder(s);

//先頭から5文字を削除する
sb.Remove(0, 5);
//この時点でsbは「かきくけこさしすせそ」

//2文字目から3文字を削除する
sb.Remove(1, 3);
//この時点でsbは「かこさしすせそ」

//6文字目から最後まで削除する
sb.Remove(5, sb.Length - 5);
//この時点でsbは「かこさしす」

string r = sb.ToString();
//かこさしす

String.RemoveとStringBuilder.Removeのパフォーマンスの比較

String.Removeの代わりにStringBuilder.Removeを使うケースは、基本的には、「文字列処理を高速に行う」で説明しているように、同じ文字列に対して何回も文字列操作を行う場合です。

具体的にString.RemoveとStringBuilder.Removeのどちらが速いかを比較したベンチマークの結果が、「StringBuilder vs. String / Fast String Operations with .NET 2.0」で紹介されています。これによると、同じ文字列に対して2回以上削除する場合はStringBuilderの方が速いとのことです。

指定した文字列を削除する

次は、文字列内から指定した文字列を削除する方法を紹介します。

指定した文字列を削除するには、「文字列を置換する」で紹介している方法を使って、削除したい文字列を空白文字列("")に置換します。

以下の例では、String.Replaceメソッドを使って、「たぶん」という文字列を削除しています。

VB.NET
コードを隠すコードを選択
Dim s As String = "たぶん今日はたぶんいい天気です。"

'「たぶん」を削除する
Dim r As String = s.Replace("たぶん", "")
'今日はいい天気です。
C#
コードを隠すコードを選択
string s = "たぶん今日はたぶんいい天気です。";

//「たぶん」を削除する
string r = s.Replace("たぶん", "");
//今日はいい天気です。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。