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

时间:2010-07-16 19:45:14

标签: c# regex

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

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

1.0.1.21 - 保密... doc 要么 Accounting.Files.doc

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

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

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

3 个答案:

答案 0 :(得分:6)

您可以使用正则表达式执行此操作:

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

结果:

10121 -- Confidential.doc

正则表达式可以按如下方式细分:

\.    match a literal dot
(?=   start a lookahead 
.*    any characters
\.    another dot
)     close the lookahead

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

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

答案 1 :(得分:2)

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

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);

答案 2 :(得分:2)

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

考虑这个选项。

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);
}

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