我想从文件名中删除特殊字符而不影响 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);
}
我有一个文件名让我们举个例子 - 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);
}