在子字符串后查找索引

时间:2015-12-16 19:23:01

标签: c# string substring

假设你有一个字符串(" haystack"),以及你想要搜索的子字符串(" needle"):

 string haystack = "D0B11234 AM21ANP AM23AN1";
 string needle = "AM21AN";   

我正在寻找一种在寻找子字符串后找到索引或子字符串的方法。

调用IndexOf()会返回指针的 start 位置,以便在这种情况下index = 9

int index = haystack.IndexOf(needle);

我最初的想法是使用LastIndexOf(),但这会返回大海捞针最后一次起始索引。

正如在this similar question(以及可能还有其他人)中所回答的那样,如果您想在needle之后立即找到该字符,则需要按照针的长度增加index这样:

int index = haystack.IndexOf(needle);
int indexAfterNeedle = index + needle.Length;

除了每次输入index + needle.Length 之外,还有一种方法(现有的,或者可能很容易扩展)允许您确定结束的索引子?

2 个答案:

答案 0 :(得分:7)

不,BCL没有内置任何东西。

通过extension method

添加自己是微不足道的
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的最后一个字符的位置,而不是之后的角色索引。

您也可能想要add an overload with an int startIndex parameter,并且实际上使用startIndex: 0从上述方法中调用那个。

请务必在扩展方法中添加错误处理,例如抛出ArgumentNullException等。

此外,如果要查找的字符串位于源字符串的末尾,则不能使用此方法返回的值来获取源字符串的子字符串,因为它位于源字符串之外。

答案 1 :(得分:2)

虽然不使用IndexOf(),但如果您的需求可能超出完全模式匹配,您可以使用正则表达式:

这将允许您执行以下操作: 搜索字符串后第一个非空格字符的位置是什么?

string testString = "D0B11234 AM21ANP AM23AN1";
string stringToSearch = "AM21AN";   
Match m = Regex.Match(testString,stringToSearch);
int endpos = m.Index + m.Length;

Match m2 = Regex.Match(testString,@"(" + Regex.Escape(stringToSearch) + @")\s*(\S)");

int nonwspos = m2.Groups[2].Index;

这将返回搜索字符串后P的位置,但即使字符串后面有空格也会返回正确的位置。