如何获取字符串的最后一部分?

64

给定以下字符串:

http://s.opencalais.com/1/pred/BusinessRelationType

我想要获取它的最后一部分:"BusinessRelationType"

我一直在考虑反转整个字符串,然后查找第一个"/",取左边的所有内容并反转。但是,我希望有更好/更简洁的方法。你有什么想法吗?

谢谢,保罗

12个回答

129

Linq的一行代码:

var lastPart = text.Split('/').Last();

如果你可能在其中有空字符串(加上 null 选项):

var lastPart = text.Split('/').Where(x => !string.IsNullOrWhiteSpace(x)).LastOrDefault();

2
这个解决方案很不错,但如果链接具有这种结构:http://s.opencalais.com/1/pred/BusinessRelationType/ 请注意最后的斜杠,lastPart 的内容将为空。使用以下代码: string lastPart = text.Substring(0, text.LastIndexOf('/')).Split('/').Last(); 将会解决这个问题 :) - L. Page
我尝试使用这个,但是出现了错误,似乎我不熟悉使用Linq方法。有没有可能添加一行解释那部分? - Jimmy Long
这里有一个比我的回答更好的答案,由@benp44提供:https://dev59.com/MnA75IYBdhLWcg3wRWyc#3387775 - naspinski

101

每当我写类似于 LastIndexOf("/") 的代码时,我会感觉自己可能在做一些不安全的事情,并且可能已经有更好的方法可用。

因为你正在使用URI,我建议使用System.Uri类。这将为您提供验证和安全易用地访问URI的任何部分。

Uri uri = new Uri("http://s.opencalais.com/1/pred/BusinessRelationType");
string lastSegment = uri.Segments.Last();

5
这应该是被接受的答案,其他的解决方案在我看来都是低劣的。 - Jesse de gans
1
这个答案是最好的。不确定为什么那些“hacky”的答案排在前面。 - Francisco Neto
这太棒了,对于从创建的位置头中获取Id非常方便。 - Chris

40
你可以使用 String.LastIndexOf
int position = s.LastIndexOf('/');
if (position > -1)
    s = s.Substring(position + 1);

另一个选项是使用 Uri,如果这符合您的需求。它可以解析其他部分的URI,并且可以很好地处理查询字符串,例如:BusinessRelationType?q=hello world

Uri uri = new Uri(s);
string leaf = uri.Segments.Last();

19
你可以使用 string.LastIndexOf 查找最后一个 /,然后使用 Substring 获取它之后的所有内容:
int index = text.LastIndexOf('/');
string rhs = text.Substring(index + 1);
请注意,由于LastIndexOf在未找到该值时返回-1,因此如果文本中没有斜杠,第二行代码将返回整个字符串。

我很好奇这种方法的性能如何:var suffix = new string(str.Reverse().TakeWhile(c => c != '.').ToArray());。由于Reverse是一个返回Enumerable的“惰性”方法,我认为它应该很不错,对吗? - gdoron
2
@gdoron:我认为这最终会分配相当多不必要的对象。它还给出了一个相反的结果,而我认为这并不是要求的。 - Jon Skeet

10

这里有一个相当简洁的方法来解决这个问题:

str.Substring(str.LastIndexOf("/")+1);

3
if (!string.IsNullOrEmpty(url))
    return url.Substring(url.LastIndexOf('/') + 1);
return null;

2

如果URL以/结尾,接受的答案可能会产生不希望的结果(空字符串)。

为了避免这种情况,您可以使用以下方法:

string lastPart = text.TrimEnd('/').Split('/').Last();

2

对于一些粗心或者不太观察的人(或最近刚戒掉咖啡的像我这样的易怒、不太观察的人),这里有一个小技巧 - Windows文件路径使用反斜杠 '\',而所有这里的示例则使用斜杠 '/'

所以要使用双反斜杠 '\\' 来获取Windows文件路径的末尾!>:)

这里的解决方案完美而完整,但也许这个技巧可以避免其他可怜的人像我一样浪费一个小时的时间!


2
在我看来,使用@"\path\to\something"是一种更简洁的方式 :) - ESD

1
Path.GetFileName

将 / 和 \ 视为分隔符。
Path.GetFileName ("http://s.opencalais.com/1/pred/BusinessRelationType") =
"BusinessRelationType"

1

或者您可以使用正则表达式/([^/]*?)$来查找匹配项


懒惰不会让事情变得更简单,但在这里你也用不着它。只需要使用“[^/]*$”即可。 - Kobi

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