【问题标题】:I want to remove special characters from File name without affecting extension in c#我想从文件名中删除特殊字符而不影响 c# 中的扩展名
【发布时间】:2021-06-14 10:44:09
【问题描述】:

我有一个文件名,比如说示例 - Hello%@Im&an#Full-Stack+.Developer.pdf

我想用下划线_替换文件名中的所有特殊字符,结果应该是这样的。

Hello__Im_an_Full_Stack_Developer.pdf

谁能帮我制作这个任务的正则表达式,我目前的正则表达式是[^\.\w]

【问题讨论】:

  • 如果你想把“开发者”前面的点改为下划线,你只需要[^\w]。专门处理文件扩展名(使用Path 类)。顺便说一句,您可能想指出您显示的正则表达式有什么问题。我们不擅长读心术

标签: c# asp.net regex c#-4.0


【解决方案1】:

使用Path分割文件名

var fileName = "Hello%@Im&an#Full-Stack+.Developer.pdf"
var fileNameWoExt = Path.GetFileNameWithoutExtension();
var ext = Path.GetExtension(fileName);
fileNameWoExt = Regex.Replace(fileNameWoExt, @"[^\w]", "_");
var result = fileNameWoExt + ext;
// "Hello__Im_an_Full_Stack__Developer.pdf"

【讨论】:

    【解决方案2】:

    你可以使用

    var filename = Regex.Replace(filename, @"(?!\.\w+$)[\W_]", "_");
    // => Hello__Im_an_Full_Stack__Developer.pdf
    

    this regex demo(?!\.\w+$)[\W_] 匹配任何非单词或_ 字符,该字符不是. 的起点+字符串序列末尾的一个或多个单词字符。

    或者,如果您打算用单个 _ 替换特殊字符序列:

    var filename = Regex.Replace(filename, @"(?:(?!\.\w+$)[\W_])+", "_");
    // => Hello_Im_an_Full_Stack_Developer.pdf
    

    请参阅regex demo

    (?:(?!\.\w+$)[\W_])+ 匹配任何非单词或_ 字符,出现一次或多次,但不以. 开头+ 字符串序列末尾的一个或多个单词字符。

    【讨论】:

      【解决方案3】:

      我喜欢 Genusatplay 将文件名与扩展名分开的想法。但我不喜欢代码中的正则表达式。我会使用 Linq 的 Select 方法。

      var letters = name.Select(x => IsLegalSymbol(x) ? x : '_');
      name = string.Join("", letters);
      
      private bool IsLegalSymbol(char c)
      {
          // Modify it to be more or less strict
          return char.IsLetter(c);
      }
      

      【讨论】:

        猜你喜欢
        • 2014-10-18
        • 2016-02-04
        • 2015-03-20
        • 1970-01-01
        • 2016-10-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多