【问题标题】:Finding the index after a substring在子字符串之后查找索引
【发布时间】:2016-03-23 01:58:45
【问题描述】:

假设您有一个字符串(“haystack”)和一个要搜索的子字符串(“needle”):

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

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

调用IndexOf() 返回针的开始 位置,这样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之外,是否有一种方法(现有的,或者可能易于扩展)可以让您确定子字符串的结束索引?

【问题讨论】:

  • 你可以用 stringtosearch.Length() 做数学来确定。
  • 结束不就是开始加长度吗?
  • @EricLippert 结尾是开头加上长度!这可能是一件非常微不足道的事情,但是解决这个问题让我想知道C# 是否包含一个返回结束而不是开始的方法(就像IndexOf 那样)。我目前正在使用startValueFromIndexOf + string.Length 执行此操作,只是想知道是否还有其他方法可用。
  • @codeCaster 很容易理解他想要做什么。也许不清楚为什么它很重要,但那是另一回事了。对 OP:不。没有,使用 startIdx 并添加长度很简单。无需额外的复杂性来进一步简化。
  • @CodeCaster 看起来不错!谢谢你。

标签: c# string substring


【解决方案1】:

不,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 等。

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

【讨论】:

  • 您不想将value.Length 而非source.Length 添加到索引吗?
  • @E.Moffat 是的,这就是在吃饭时在 Notepad++ 中快速复制粘贴示例的方法。
  • 感谢您的回答!即使这是一件非常微不足道的事情,一般的扩展方法对我来说仍然是新的,我不会想到这一点 - 所以谢谢你教我一些东西!
  • 我猜你可能已经知道这一点,但你可以将其简化为return (index >= 0) ? index + value.Length : index;
  • 只是为其他读者、@levelonehuman 和我自己链接this MSDN page about Extension methods,因为我对实施他不是很有经验。
【解决方案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 的位置,但即使字符串后有空格也会返回正确的位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 2012-02-10
    • 2014-03-17
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多