在C#中将字符串从最后一个点断开的最佳方法

12

如何在最后一个点处将字符串拆分成两个部分,以最佳方式且符合惯用语?基本上是将扩展名与文件路径或URL中的其余部分分离。到目前为止,我所做的是Split("."),然后使用String.Join(".")除了最后一部分之外的所有内容。听起来像是杀鸡焉用牛刀。

9个回答

27

如果你想要更好的性能,可以考虑以下方式:

    string s = "a.b.c.d";
    int i = s.LastIndexOf('.');
    string lhs = i < 0 ? s : s.Substring(0,i),
        rhs = i < 0 ? "" : s.Substring(i+1);

9
你可以使用 Path.GetFilenameWithoutExtension() 方法,如果该方法无法满足您的需求,您可以尝试以下方法:
int idx = filename.LastIndexOf('.');

if (idx >= 0)
   filename = filename.Substring(0,idx);

这会在URL的一部分上起作用吗(使用/而不是\)?它也会返回“文件夹”吗?Path.GetFilename()仅返回文件的名称,不包括目录,据我所知。 - pupeno
如果 OP 只问了有关文件路径,那么这将是一个 +1。但是 System.IO.Path 文档没有提到支持 URL。 - OregonGhost
正确,但如果文件名不包含路径,则可能适用于您。 - Philippe Leybaert
可能会起作用,但不幸的是这意味着依赖于未记录的功能。如果您可以接受这一点,System.IO.Path就是解决问题的方法。 - OregonGhost
如果有人想知道为什么Path.GetExtension等函数不起作用:各种Path函数假定你正在使用Windows路径......因此,如果您的字符串包含任何无效字符(如“<”),它们会抛出异常。 我刚遇到一个这样的情况,我想要从某个文件获取扩展名,该文件来自某个地方,其中“<”是完全有效的,并且将要去往另一个地方,在那里它也是有效的,这就引导我在这里寻找一种干净的方法来仅在最后一个点上分割字符串,而不需要框架试图聪明地认为它是一个文件名,因此最好进行更多的验证。 - neminem

3

要获取没有扩展名的路径,请使用

System.IO.Path.GetFileNameWithoutExtension(fileName)

要获取扩展名(包括点),请使用以下命令

Path.GetExtension(fileName)

编辑:

不幸的是,GetFileNameWithoutExtension会剥离掉前面的路径,所以您可以使用以下方法:

if (path == null)
{
    return null;
}
int length = path.LastIndexOf('.');
if (length == -1)
{
    return path;
}
return path.Substring(0, length);

2

这里可能会用到字符串方法LastIndexOf

但是,Path或FileInfo运算符更适合基于文件名的操作。


1

我觉得你真正想要的是 Path.GetFileNameWithoutExtension 方法 (System.IO),但只是为了好玩:

string input = "foo.bar.foobar";
int lastDotPosition = input.LastIndexOf('.');

if (lastDotPosition == -1)
{
    Console.WriteLine("No dot found");
}
else if (lastDotPosition == input.Length - 1)
{
    Console.WriteLine("Last dot found at the very end");

}
else
{
    string firstPart = input.Substring(0, lastDotPosition);
    string lastPart = input.Substring(lastDotPosition + 1);

    Console.WriteLine(firstPart);
    Console.WriteLine(lastPart);
}

1

1

使用LastIndexOf方法如何呢?它能够返回一个字符最后出现的位置。然后你可以使用Substring来提取你想要的。


1
String.LastIndexOf方法会返回字符串中存在点号的位置。然后,您可以使用String.Substring方法来拆分字符串。

1
你可以使用字符串的方法 LastIndexOf 和 Substring 来完成任务。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接