在子字符串后查找索引

本文关键字:查找 索引 字符串 | 更新日期: 2023-09-27 18:27:08

假设您有一个字符串("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参数的重载,并使用startIndex: 0从上面的方法中实际调用该重载。

并且一定要将错误处理添加到扩展方法中,比如抛出ArgumentNullException等等。

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

虽然不使用IndexOf(),但如果您的需求可能超出了精确的模式匹配,则可以使用Regex:

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

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的位置,但即使字符串后有空格,也会返回正确的位置。