C# string.replace 删除非法字符[重复]

问题描述 投票:0回答:4

我正在开发一个程序,该程序读取文件并根据其专栏标题保存其中的各个部分。其中一些标题的文件名包含非法字符,因此我编写了这段代码来处理这些问题。

string headerfile = saveDir + "\\" + tVS.Nodes[r].Text.Replace("\"", "").Replace
              ("/","").Replace(":"," -").Replace(">","(Greater Than)") + ".csv";

如果我没有 4 个

.Replace()
,有没有更好的方法可以做到这一点?或者是否有某种我不知道的内置非法字符删除器?

谢谢!

编辑:它不需要用任何特定的内容替换字符。空格就足够了。

c# string
4个回答
36
投票

正则表达式通常是一个很好的方法,但当你用不同的东西替换每个字符时就不行了。您可能会考虑用相同的东西替换它们,并且只使用

System.IO.Path.GetInvalidFileNameChars()

string filename = tVS.Nodes[r].Text;

foreach(char c in System.IO.Path.GetInvalidFileNameChars()) {
    filename = filename.Replace(c, '_');
}

10
投票

System.IO.Path.GetInvalidFileNameChars()
包含所有无效字符。

这是一个示例方法:

public static string SanitizeFileName
(
  string fileName, 
  char replacementChar = '_'
)
{
  HashSet<char> blackList = new(System.IO.Path.GetInvalidFileNameChars());
  char[] output = fileName.ToCharArray();
  for (int i = 0, ln = output.Length; i < ln; i++)
  {
    if (blackList.Contains(output[i]))
    {
      output[i] = replacementChar;
    }
  }
  return new String(output);
}

如果您想将连续的无效字符压缩为单个替换字符,您可能需要这样的东西:

public static string SanitizeFileNameAndCondense
(
  string fileName, 
  char replacementChar = '_'
)
{
  HashSet<char> blackList = new(System.IO.Path.GetInvalidFileNameChars());
  char[] output = fileName.ToCharArray();
  bool replaced = false;  
  int i = 0, x = 0, ln = output.Length;
  for (; i < ln; i++)
  {
    if (blackList.Contains(output[i]))
    {
      if (!replaced)
      {
        output[x++] = replacementChar;
      }      
      replaced = true;
    }
    else
    {
      output[x++] = output[i];
      replaced = false;      
    }
  }  
  return new String(output, 0, x);
}

2
投票

看看 Regex.Replace here,它会在单独删除字符时完成您想要的一切。选择性替换其他字符串可能会更棘手。


2
投票
string charsToRemove = @"\/:";TODO complete this list

string filename;

string pattern = string.format("[{0}]", Regex.Escape(charsToRemove));
Regex.Replace(filename, pattern, "");

如果你只是想删除非法字符,而不是用其他字符替换它们,你可以使用这个。

© www.soinside.com 2019 - 2024. All rights reserved.