我想从文件名中删除特殊字符而不影响 c# 中的扩展名

I want to remove special characters from File name without affecting extension in c#

我有一个文件名让我们举个例子 - Hello%@Im&an#Full-Stack+.Developer.pdf

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

Hello__Im_an_Full_Stack_Developer.pdf

任何人都可以帮助我为这个任务制作正则表达式,我当前的正则表达式是这个 [^\.\w]

使用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"

您可以使用

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_])+ 匹配任何非单词或 _ 字符,一次或多次出现,不以 . + 字符串序列末尾的一个或多个单词字符开头。

我喜欢 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);
}