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

Posted

技术标签:

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

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

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

Hello__Im_an_Full_Stack_Developer.pdf

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

【问题讨论】:

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

【讨论】:

以上是关于我想从文件名中删除特殊字符而不影响 c# 中的扩展名的主要内容,如果未能解决你的问题,请参考以下文章

从C#中的数据中删除特殊字符后如何将dbf文件中的数百万行数据上传到SQL Server

从NSString中删除一些特殊字符,以获取附加到电子邮件的文件名PDF

如何删除/替换字符串列中的一系列特殊字符? [关闭]

在内存中创建 eml 文件而不将其保存在磁盘上

C#删除字符串中的回车换行空格等特殊字符

从 C# 中的字符串中删除换行符的最快方法是啥?