我有一个应用程序需要我“清理”“脏”文件名。
我想知道是否有人知道如何处理名为的文件:
1.0.1.21 - 保密... doc 要么 Accounting.Files.doc
基本上不保证每个文件名的句点都在同一个地方。我希望通过驱动器进行递归,在文件名本身中搜索句点(减去扩展名),删除句点,然后将扩展名附加到其上。
有没有人知道更好的方法或者如何执行我希望做的事情? 注意,regEx是该项目的要求。
编辑:我没有看到1.0.1.21 - Confidential ... doc,而是希望看到:10121 - Confidential.doc答案 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);
}
* 哎呀,看起来你说使用正则表达式是要求。没关系! (虽然我不得不问:为什么?)