使用RegEx删除文件名中的多个句点

我有一个应用程序,要求我“清理”“脏”文件名。

我想知道是否有人知道如何处理名称如下的文件:

1.0.1.21 – 机密… doc或Accounting.Files.doc

基本上,不能保证每个文件名的句点都在同一个地方。 我希望通过驱动器进行递归,在文件名本身中搜索句点(减去扩展名),删除句点然后将扩展名附加到其上。

有没有人知道更好的方法或者如何执行我希望做的事情? 注意,regEx是该项目的要求。

编辑:我没有看到1.0.1.21 – 机密… doc,而是希望看到:10121 – Confidential.doc
对于其他文件名,而不是Accounting.Files.doc,我想看看AccountingFiles.doc

你可以使用正则表达式:

string s = "1.0.1.21 -- Confidential...doc"; s = Regex.Replace(s, @"\.(?=.*\.)", ""); Console.WriteLine(s); 

结果:

 10121  -  Confidential.doc

正则表达式可以分解如下:

 \。 匹配一个文字点
 (?=开始前瞻 
 。*任何字符
 \。 另一个点
 )关闭先行

或者用简单的英语:删除每个后面至少有一个点的点。

使用内置方法处理文件名和扩展名会更清晰,所以如果你能以某种方式删除它必须是正则表达式的要求,我认为它会使解决方案更好。

这是一个不使用正则表达式的替代解决方案 – 也许它更具可读性:

 string s = "1.0.1.21 -- Confidential...doc"; int extensionPoint = s.LastIndexOf("."); if (extensionPoint < 0) { extensionPoint = s.Length; } string nameWithoutDots = s.Substring(0, extensionPoint).Replace(".", ""); string extension = s.Substring(extensionPoint); Console.WriteLine(nameWithoutDots + extension); 

我没有正则表达式*这样做。 (免责声明:我对正则表达式不太满意,所以这可能就是原因。)

考虑这个选项。

 string RemovePeriodsFromFilename(string fullPath) { string dir = Path.GetDirectoryName(fullPath); string filename = Path.GetFileNameWithoutExtension(fullPath); string sanitized = filename.Replace(".", string.Empty); string ext = Path.GetExtension(fullPath); return Path.Combine(dir, sanitized + ext); } 

* 哎呀 ,看起来像你说使用正则表达式是一个要求 。 没关系! (虽然我不得不问: 为什么 ?)