ここでは、例えば指定した文字列からファイル名に使えない文字を全て削除するというように、文字列から指定した文字を削除する方法を紹介します。
なお、削除したい文字が文字列の前後に付いた文字だけの場合は、「文字列の前後に付いている余計な文字を削除する」をご覧ください。また、文字ではなく文字列を削除する場合は、「文字列を削除する」をご覧ください。
何の工夫もなく、For文とString.Replaceメソッドで1文字ずつ削除すると、次のようになります。この例では、改行文字(キャリッジリターンとラインフィード)を削除しています。
'基になる文字列 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) 'こんにちは。こんばんは。
//基になる文字列 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を使って行うと、次のようになります。
'基になる文字列 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(), ""))
//基になる文字列 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の違いについては、「文字列を置換する」をご覧ください。
''' <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
/// <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(); }
文字を削除するのではなく、逆に削除しない文字だけを拾って文字列にするという方法も考えられます。
以下の例では、For文とStringBuilder.Appendメソッドを使って、制御文字を削除しています。
'基になる文字列 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) 'こんにちは。
//基になる文字列 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を使って行うと、次のようになります。
'基になる文字列 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)))
//基になる文字列 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)));
正規表現を使って指定した文字を削除しようとすると、例えば次のようになります。なお正規表現について詳しくは、「正規表現を使って文字列を置換する」をご覧ください。
'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
//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