假设您有一个字符串("haystack")和一个要搜索的子字符串("needle"):
string haystack = "D0B11234 AM21ANP AM23AN1"; string needle = "AM21AN";
我正在寻找一种在寻找子字符串后找到索引或子字符串的方法.
调用IndexOf()
返回针的起始位置,index = 9
在这种情况下:
int index = haystack.IndexOf(needle);
我最初的想法是使用LastIndexOf()
,但它返回大海捞针最后一次出现的起始索引.
正如在这个类似的问题(以及可能的其他问题)中所回答的那样,如果你想立即找到后面的字符needle
,则需要index
按照针的长度递增,如下所示:
int index = haystack.IndexOf(needle); int indexAfterNeedle = index + needle.Length;
是否存在一种方法(现有的,或者可能很容易扩展),除了index + needle.Length
每次允许您确定子字符串的结束索引时都要键入?
不,BCL没有内置任何东西.
通过扩展方法添加自己是微不足道的:
public static int EndIndexOf(this string source, string value) { int index = source.IndexOf(value); if (index >= 0) { index += value.Length; } return index; }
演示:
string testString = "D0B11234 AM21ANP AM23AN1"; string stringToSearch = "AM21AN"; int endIndex = testString.EndIndexOf(stringToSearch); Console.WriteLine(testString); Console.WriteLine(endIndex); Console.WriteLine(testString.Substring(endIndex));
输出:
D0B11234 AM21ANP AM23AN1 15 P AM23AN1
根据您的要求,这可能看起来像是一个错误的错误,因此您可能希望将其更改index += value.Length - 1
为返回最后一个字符的位置value
,而不是之后的字符索引.
您还可能希望使用int startIndex
参数添加重载,并实际使用a从上面的方法中调用该参数startIndex: 0
.
并确保将错误处理添加到扩展方法,如抛出ArgumentNullException
等等.
此外,如果要查找的字符串位于源字符串的末尾,则不能使用此方法返回的值来获取源字符串的子字符串,因为它将位于源字符串之外.