using System.Text.RegularExpressions;
using System.Collections.Generic;
using System.Diagnostics;
private static char[] _invalidCharacters;
public static void Main()
var paths = new List<string>()
"StringHelper.RemoveInvalidCharacters",
"StringHelper.RemoveInvalidCharacters(\"Ok?\", 'x'));",
"return FetchAndCache<T>(key, retrieveData, absoluteExpiry, relativeExpiry);",
paths.ForEach(p => RemoveInvalidCharacters(p));
paths.ForEach(p => RemoveInvalidCharacters2(p));
paths.ForEach(p => RemoveInvalidCharacters3(p));
paths.ForEach(p => RemoveInvalidCharacters4(p));
paths.ForEach(p => RemoveInvalidCharacters5(p));
var sw1 = Stopwatch.StartNew();
for (int i = 0; i < iteration; i++)
paths.ForEach(p => RemoveInvalidCharacters(p));
Console.WriteLine(string.Format("StringHelper.RemoveInvalidCharacters 1: {0} ms", sw1.ElapsedMilliseconds));
var sw2 = Stopwatch.StartNew();
for (int i = 0; i < iteration; i++)
paths.ForEach(p => RemoveInvalidCharacters2(p));
Console.WriteLine(string.Format("StringHelper.RemoveInvalidCharacters 2: {0} ms", sw2.ElapsedMilliseconds));
var sw3 = Stopwatch.StartNew();
for (int i = 0; i < iteration; i++)
paths.ForEach(p => RemoveInvalidCharacters3(p));
Console.WriteLine(string.Format("StringHelper.RemoveInvalidCharacters 3: {0} ms", sw3.ElapsedMilliseconds));
var sw4 = Stopwatch.StartNew();
for (int i = 0; i < iteration; i++)
paths.ForEach(p => RemoveInvalidCharacters4(p));
Console.WriteLine(string.Format("StringHelper.RemoveInvalidCharacters 4: {0} ms", sw4.ElapsedMilliseconds));
var sw5 = Stopwatch.StartNew();
for (int i = 0; i < iteration; i++)
paths.ForEach(p => RemoveInvalidCharacters5(p));
Console.WriteLine(string.Format("StringHelper.RemoveInvalidCharacters 5: {0} ms", sw5.ElapsedMilliseconds));
public static char[] InvalidCharacters
if (_invalidCharacters == null)
_invalidCharacters = getInvalidCharacters();
return _invalidCharacters;
public static string RemoveInvalidCharacters2(string content, char replace = '_', bool doNotReplaceBackslashes = false)
StringBuilder sb = new StringBuilder(content);
for (int i = 0; i < InvalidCharacters.Length; i++)
c = InvalidCharacters[i];
if (c != '\\' || !doNotReplaceBackslashes)
public static string RemoveInvalidCharacters(string content, char replace = '_', bool doNotReplaceBackslashes = false)
if (string.IsNullOrEmpty(content))
var idx = content.IndexOfAny(InvalidCharacters);
var sb = new StringBuilder(content);
if (sb[idx] != '\\' || !doNotReplaceBackslashes)
idx = content.IndexOfAny(InvalidCharacters, idx+1);
public static string RemoveInvalidCharacters3(string content, char replace = '_', bool doNotReplaceBackslashes = false)
if (string.IsNullOrEmpty(content))
var sep = replace.ToString();
return string.Join(sep, content.Split(InvalidCharacters));
public static string RemoveInvalidCharacters4(string content, char replace = '_', bool doNotReplaceBackslashes = false)
if (string.IsNullOrEmpty(content))
var sep = replace.ToString();
return Path.GetInvalidFileNameChars().Aggregate(content, (current, c) => current.Replace(c.ToString(), sep));
public static string RemoveInvalidCharacters5(string content, char replace = '_', bool doNotReplaceBackslashes = false)
if (string.IsNullOrEmpty(content))
string regexSearch = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars());
Regex r = new Regex(string.Format("[{0}]", Regex.Escape(regexSearch)));
return r.Replace(content, replace.ToString());
private static char[] getInvalidCharacters()
var invalidChars = new List<char>();
invalidChars.AddRange(Path.GetInvalidFileNameChars());
invalidChars.AddRange(Path.GetInvalidPathChars());
return invalidChars.ToArray();