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

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

ここでは、例えば指定した文字列からファイル名に使えない文字を全て削除するというように、文字列から指定した文字を削除する方法を紹介します。

なお、削除したい文字が文字列の前後に付いた文字だけの場合は、「文字列の前後に付いている余計な文字を削除する」をご覧ください。また、文字ではなく文字列を削除する場合は、「文字列を削除する」をご覧ください。

Replaceメソッドで1文字ずつ削除する方法

何の工夫もなく、For文とString.Replaceメソッドで1文字ずつ削除すると、次のようになります。この例では、改行文字(キャリッジリターンとラインフィード)を削除しています。

VB.NET
コードを隠すコードを選択
'基になる文字列
Dim str As String = vbCrLf & "こんにちは。" & vbCrLf & "こんばんは。" & vbCrLf
'削除する文字の配列
Dim removeChars As Char() = New Char() {vbCr, vbLf}

'削除する文字を1文字ずつ削除する
For Each c As Char In removeChars
    str = str.Replace(c.ToString(), "")
Next

Console.WriteLine(str)
'こんにちは。こんばんは。
C#
コードを隠すコードを選択
//基になる文字列
string str = "\r\nこんにちは。\r\nこんばんは。\r\n";
//削除する文字の配列
char[] removeChars = new char[] { '\r', '\n' };

//削除する文字を1文字ずつ削除する
foreach (char c in removeChars)
{
    str = str.Replace(c.ToString(), "");
}

Console.WriteLine(str);
//こんにちは。こんばんは。

これと同じことをLinqを使って行うと、次のようになります。

VB.NET
コードを隠すコードを選択
'基になる文字列
Dim str As String = vbCrLf & "こんにちは。" & vbCrLf & "こんばんは。" & vbCrLf
'削除する文字の配列
Dim removeChars As Char() = New Char() {vbCr, vbLf}

str = removeChars.Aggregate( _
    str, Function(s, c) s.Replace(c.ToString(), ""))
C#
コードを隠すコードを選択
//基になる文字列
string str = "\r\nこんにちは。\r\nこんばんは。\r\n";
//削除する文字の配列
char[] removeChars = new char[] { '\r', '\n' };

str = removeChars.Aggregate(
    str, (s, c) => s.Replace(c.ToString(), ""));

これをメソッドにしてみました。今度はStringBuilder.Replaceメソッドを使っています。String.ReplaceとStringBuilder.Replaceの違いについては、「文字列を置換する」をご覧ください。

VB.NET
コードを隠すコードを選択
''' <summary>
''' 指定した文字列から指定した文字を全て削除する
''' </summary>
''' <param name="s">対象となる文字列。</param>
''' <param name="characters">削除する文字の配列。</param>
''' <returns>sに含まれている全てのcharacters文字が削除された文字列。</returns>
Public Shared Function RevoveChars(s As String, characters As Char()) As String
    Dim buf As New System.Text.StringBuilder(s)
    For Each c As Char In characters
        buf.Replace(c.ToString(), "")
    Next
    Return buf.ToString()
End Function
C#
コードを隠すコードを選択
/// <summary>
/// 指定した文字列から指定した文字を全て削除する
/// </summary>
/// <param name="s">対象となる文字列。</param>
/// <param name="characters">削除する文字の配列。</param>
/// <returns>sに含まれている全てのcharacters文字が削除された文字列。</returns>
public static string RevoveChars(string s, char[] characters)
{
    System.Text.StringBuilder buf = new System.Text.StringBuilder(s);
    foreach (char c in characters)
    {
        buf.Replace(c.ToString(), "");
    }
    return buf.ToString();
}

削除しない文字を1文字ずつ選んでいく方法

文字を削除するのではなく、逆に削除しない文字だけを拾って文字列にするという方法も考えられます。

以下の例では、For文とStringBuilder.Appendメソッドを使って、制御文字を削除しています。

VB.NET
コードを隠すコードを選択
'基になる文字列
Dim s As String = "こんにちは。" & vbCrLf

'制御文字を削除する
Dim buf As New System.Text.StringBuilder(s.Length)
For Each c As Char In s
    '制御文字以外であればStringBuilderに追加する
    If Not Char.IsControl(c) Then
        buf.Append(c)
    End If
Next
s = buf.ToString()

Console.WriteLine(s)
'こんにちは。
C#
コードを隠すコードを選択
//基になる文字列
string s = "こんにちは。\r\n";

//制御文字を削除する
System.Text.StringBuilder buf = new System.Text.StringBuilder(s.Length);
foreach (char c in s)
{
    //制御文字以外であればStringBuilderに追加する
    if (!char.IsControl(c))
    {
        buf.Append(c);
    }
}
s = buf.ToString();

Console.WriteLine(s);
//こんにちは。

これと似たことをLinqを使って行うと、次のようになります。

VB.NET
コードを隠すコードを選択
'基になる文字列
Dim s As String = "こんにちは。" & vbCrLf

'制御文字を削除する
s = New String(s.Where(Function(c) Not Char.IsControl(c)).ToArray())
'.NET Framework 4.0からは、String.Concatを使って次のようにもできる
s = String.Concat(s.Where(Function(c) Not Char.IsControl(c)))
C#
コードを隠すコードを選択
//基になる文字列
string s = "こんにちは。\r\n";

//制御文字を削除する
s = new string(s.Where(c => !char.IsControl(c)).ToArray());
//.NET Framework 4.0からは、String.Concatを使って次のようにもできる
s = string.Concat(s.Where(c => !char.IsControl(c)));

正規表現を使用した方法

正規表現を使って指定した文字を削除しようとすると、例えば次のようになります。なお正規表現について詳しくは、「正規表現を使って文字列を置換する」をご覧ください。

VB.NET
コードを隠すコードを選択
'Imports System.Text.RegularExpressions

'基になる文字列
Dim fileName As String = "!?#$/%&(*).txt"
'削除する文字の配列
Dim removeChars As Char() = System.IO.Path.GetInvalidFileNameChars()

'削除する文字を文字列にする
Dim removeCharsString As New String(removeChars)
'削除する文字にマッチするパターンを作成する
Dim removePattern As String = String.Format("[{0}]", _
    Regex.Escape(removeCharsString))
'削除する文字を""に置換する
Dim newFileName As String = Regex.Replace(fileName, removePattern, "")

Console.WriteLine(newFileName)
'!#$%&().txt
C#
コードを隠すコードを選択
//using System.Runtime.InteropServices;

//基になる文字列
string fileName = @"!?#$/%&(*).txt";
//削除する文字の配列
char[] removeChars = System.IO.Path.GetInvalidFileNameChars();

//削除する文字を文字列にする
string removeCharsString = new string(removeChars);
//削除する文字にマッチするパターンを作成する
string removePattern = string.Format("[{0}]",
    Regex.Escape(removeCharsString));
//削除する文字を""に置換する
string newFileName = Regex.Replace(fileName, removePattern, "");

Console.WriteLine(newFileName);
//!#$%&().txt

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

  • コードの先頭に記述されている「Imports ??? がソースファイルの一番上に書かれているものとする」(C#では、「using ???; がソースファイルの一番上に書かれているものとする」)の意味が分からないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。