using System;using System.Diagnostics;
public static class Extensions
{
/// <summary>
/// Get a substring between two anchor strings, minimal span
/// </summary>
/// <param name="s">source string</param>
/// <param name="from">search from end of this string</param>
/// <param name="to">to beginning of this string, searching backwards, from end to start of s</param>
/// <returns>a substring between from and to, maximal span</returns>
public static string GetFirstStringBetweenStringsMinSpanCleanup(this string s, string from, string to)
{
if (string.IsNullOrEmpty(s) || string.IsNullOrEmpty(from) || string.IsNullOrEmpty(to)) return string.Empty;
int idxFrom = s.IndexOf(from);
int idxStart = idxFrom + from.Length; //we filter "not found" -1, never race condtn
if (idxFrom == -1 || idxStart >= s.Length - 1)
return string.Empty;
int idxEnd = s.IndexOf(to, idxStart); //Exact definition, but intuitively next line meets likely expectations -> YOU CHOOSE
//int idxEnd = s.IndexOf(to, idxStart + 1); //Start next position after, leaving a space for 1 character to be returned
if (idxEnd == -1 || idxEnd <= idxStart)
return string.Empty;
return s.Substring(idxStart, idxEnd - idxStart);
}
/// <summary>
/// Get a substring between two anchor strings, MINIMAL SPAN
/// </summary>
/// <param name="s">source string</param>
/// <param name="from">search from end of this string</param>
/// <param name="to">to beginning of this string, searching backwards, from end to start of s</param>
/// <returns>a substring between from and to, maximal span</returns>
public static string GetFirstStringBetweenStringsMinSpan(this string s, string from, string to)
{
Console.Write("args from {0} to {1} = ", from, to); //debug
//edge cases
if (string.IsNullOrEmpty(s) || string.IsNullOrEmpty(from) || string.IsNullOrEmpty(to)) return string.Empty;
//if (from.Length >= s.Length || to.Length >= s.Length) return string.Empty; //redundant, this Rule take care of below
int idxFrom = s.IndexOf(from);
int idxStart = idxFrom + from.Length; //we filter "not found" -1, never race condtn
if (idxFrom == -1)
return string.Empty;
else if (idxStart >= s.Length - 1) //for testing combine to 1 line, we combining a idx with a length, and w/ lengths we normally subtract 1
{
Console.WriteLine("r1. idxStart={0} >= (s.Length - 1)={1}", idxStart, s.Length - 1);
return string.Empty;
}
int idxEnd = s.IndexOf(to, idxStart); //Exact definition, but intuitively next line meets likely expectations -> YOU CHOOSE
//int idxEnd = s.IndexOf(to, idxStart + 1); //Start next position after, leaving a space for 1 character to be returned
if (idxEnd == -1 )
return string.Empty;
else if (idxEnd > s.Length - 1) //Rule 2 never gets used
{
Console.WriteLine("r2. idxEnd={0} > (s.Length - 1)={1}", idxEnd, s.Length - 1);
return string.Empty;
}
else if (idxEnd <= idxStart)
{
Console.WriteLine("r3. idxEnd={0} <= idxStart={1}", idxEnd, idxStart);
return string.Empty;
}
return s.Substring(idxStart, idxEnd - idxStart);
}
}
public class Program
{
public static void Main()
{
string test = "abcd";
Console.WriteLine(test);
Console.WriteLine("=================");
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan(null, null));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("", ""));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan(test, test));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("", test));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan(test,""));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("a", "a"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("a", "b"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("a", "c"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("a", "d"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("a", "e"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("e", "e"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("ab", "a"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("ab", "b"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("ab", "c"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("ab", "d"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("ab", "a"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("ab", "b"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("ab", "c"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("ab", "d"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("abc", "a"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("abc", "b"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("abc", "c"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("abc", "d"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan(test, "a"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan(test, "b"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan(test, "c"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan(test, "d"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("a","abc"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("b", "abc"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("c", "abc"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("d", "abc"));
Console.WriteLine();
test = "abcdabcd";
Console.WriteLine(test);
Console.WriteLine("=================");
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan(null, null));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("", ""));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan(test, test));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("", test));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan(test, ""));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("a", "a"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("a", "b"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("a", "c"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("a", "d"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("a", "e"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("e", "e"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("ab", "a"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("ab", "b"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("ab", "c"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("ab", "d"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("ab", "a"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("ab", "b"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("ab", "c"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("ab", "d"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("abc", "a"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("abc", "b"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("abc", "c"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("abc", "d"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan(test, "a"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan(test, "b"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan(test, "c"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan(test, "d"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("a", "abc"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("b", "abc"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("c", "abc"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("d", "abc"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("abc", "d")); //pass
Console.WriteLine();
test = "aaaa";
Console.WriteLine(test);
Console.WriteLine("=================");
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("a", "a"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("aa", "a"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("aaa", "a"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("aaaa", "a"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("a", "a"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("a", "aa"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("a", "aaa"));
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("a", "aaaa"));
Console.WriteLine();
test = "aaaaaaaaaaaaaaaaaaaaaaaaaaaabbbb";
Console.WriteLine(test);
Console.WriteLine("=================");
Console.WriteLine(test.GetFirstStringBetweenStringsMinSpan("bbbb", "aaaa"));
string result = string.Empty;
Stopwatch sw = new Stopwatch();
sw.Start();
result = test.GetFirstStringBetweenStringsMinSpan("aaaaaaa", "bb");
sw.Stop();
Console.WriteLine(result);
Console.WriteLine(" in " + sw.ElapsedTicks + " ticks.");
}
}