ここでは、例えば「あいうえお」の2文字目から3文字削除して「あお」にするように、文字列内の指定した位置から指定した長さを削除する方法を紹介します。また、「あうえおうえい」から「うえ」を削除して「あおい」にするように、文字列内の指定した文字列を削除する方法も紹介します。
なお、文字列から指定した文字を削除する方法は「文字列から指定した文字を削除する」で説明しています。
文字列内の指定した位置から指定した長さを削除するには、String.Removeメソッドを使います。
細かい説明は後にして、まずは具体例を紹介します。
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) 'あいうえお
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.Removeメソッドと同じことをString.Substringメソッドを使ってもできます。特に先頭または末尾の文字列を削除する場合は、String.Substringメソッドでも文字列を結合する必要がありませんので、どちらを使ってもほとんど同じです。
先程のString.Removeメソッドの例をString.Substringメソッドを使って書き換えたコードを以下に示します。
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) 'あいうえお
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メソッドのパラメータが1つのオーバーロードは、内部でSubstringメソッドを呼び出しています。よってこの場合は、直接Substringを呼び出した方が効率的と考えられます。実際「C# Remove String Usage」によると、文字列の末尾から数文字削除する場合、RemoveよりもSubstringの方が速いということです。
私自身も以下のようなコードでRemoveとSubstringのどちらが速いかを比べてみました。すると、先頭の数文字を削除する場合はSubstringの方が若干速いようでしたが、末尾の数文字を削除する場合はほとんど差がありませんでした。真ん中の数文字を削除する場合は、Removeの方が明らかに速かったです。
なおこの結果は私が簡単に試行してみた限りの結果ですので、正確ではないかもしれないことをご了承ください。
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
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
Stringクラスと同様に、StringBuilder.Removeメソッドでも文字列を削除できます。StringBuilder.RemoveがString.Removeと違うのは、パラメータが1つのオーバーロードがないことと、StringBuilderオブジェクトそのものが変更される点です。
以下にStringBuilder.Removeを使用した例を示します。
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() 'かこさしす
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のどちらが速いかを比較したベンチマークの結果が、「StringBuilder vs. String / Fast String Operations with .NET 2.0」で紹介されています。これによると、同じ文字列に対して2回以上削除する場合はStringBuilderの方が速いとのことです。
次は、文字列内から指定した文字列を削除する方法を紹介します。
指定した文字列を削除するには、「文字列を置換する」で紹介している方法を使って、削除したい文字列を空白文字列("")に置換します。
以下の例では、String.Replaceメソッドを使って、「たぶん」という文字列を削除しています。
Dim s As String = "たぶん今日はたぶんいい天気です。" '「たぶん」を削除する Dim r As String = s.Replace("たぶん", "") '今日はいい天気です。
string s = "たぶん今日はたぶんいい天気です。"; //「たぶん」を削除する string r = s.Replace("たぶん", ""); //今日はいい天気です。
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。