我想从文件名中删除特殊字符而不影响 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