Finding all positions of substring in a larger string in C# Finding all positions of substring in a larger string in C# asp.net asp.net

Finding all positions of substring in a larger string in C#


Here's an example extension method for it:

public static List<int> AllIndexesOf(this string str, string value) {    if (String.IsNullOrEmpty(value))        throw new ArgumentException("the string to find may not be empty", "value");    List<int> indexes = new List<int>();    for (int index = 0;; index += value.Length) {        index = str.IndexOf(value, index);        if (index == -1)            return indexes;        indexes.Add(index);    }}

If you put this into a static class and import the namespace with using, it appears as a method on any string, and you can just do:

List<int> indexes = "fooStringfooBar".AllIndexesOf("foo");

For more information on extension methods, http://msdn.microsoft.com/en-us/library/bb383977.aspx

Also the same using an iterator:

public static IEnumerable<int> AllIndexesOf(this string str, string value) {    if (String.IsNullOrEmpty(value))        throw new ArgumentException("the string to find may not be empty", "value");    for (int index = 0;; index += value.Length) {        index = str.IndexOf(value, index);        if (index == -1)            break;        yield return index;    }}


Why don't you use the built in RegEx class:

public static IEnumerable<int> GetAllIndexes(this string source, string matchString){   matchString = Regex.Escape(matchString);   foreach (Match match in Regex.Matches(source, matchString))   {      yield return match.Index;   }}

If you do need to reuse the expression then compile it and cache it somewhere. Change the matchString param to a Regex matchExpression in another overload for the reuse case.


using LINQ

public static IEnumerable<int> IndexOfAll(this string sourceString, string subString){    return Regex.Matches(sourceString, subString).Cast<Match>().Select(m => m.Index);}