using System; namespace ConsoleApp1 { public class StringIndex { private const int NOT_FOUND = -1; private string _where; private string _what; private int _index; public StringIndex(string where, string what, int index = NOT_FOUND) { _index = index; _where = where; _what = what; } private int Validate(string name, int value) { if (value < 0) throw new Exception($"[{value}] cannot be negative!"); return value; } public bool Found { get { return _index != NOT_FOUND; } } public string What { get { if (_index == NOT_FOUND) return string.Empty; return _where.Substring(_index, _what.Length); } } public string Before() { if (_index == NOT_FOUND) return string.Empty; return _where.Substring(0, _index); } public string After() { if (_index == NOT_FOUND) return string.Empty; var start = _what.Length + _index; if (start >= _where.Length) return string.Empty; return _where.Substring(start); } public string TakeBackward(int count, int skip = 0) { count = Validate("count", count); skip = Validate("skip", skip); if (count == 0 || _index == NOT_FOUND) return string.Empty; var start = _index - count - skip; if (start < 0) start = 0; count = _index - start - skip; if (count <= 0) return string.Empty; if (start + count >= _where.Length) count = _where.Length - start; return _where.Substring(start, count); } public string TakeForward(int count, int skip = 0) { count = Validate("count", count); skip = Validate("skip", skip); if (count == 0 || _index == NOT_FOUND) return string.Empty; var start = _index + _what.Length + skip; if (start >= _where.Length) return string.Empty; if (start + count >= _where.Length) count = _where.Length - start; return _where.Substring(start, count); } public static implicit operator bool(StringIndex obj) => obj.Found; } public class StringFinder { public static StringIndex Find(string where, string what, bool caseInsensitive = false) { if (string.IsNullOrEmpty(where) || string.IsNullOrEmpty(what)) return new StringIndex(string.Empty, string.Empty); int index; if (caseInsensitive) { index = where.IndexOf(what, StringComparison.CurrentCultureIgnoreCase); } else { index = where.IndexOf(what); } if (index == -1) return new StringIndex(where, what); return new StringIndex(where, what, index); } public static StringIndex Between(string where, string left, string right, bool caseInsensitive = false) { var first = Find(where, left, caseInsensitive); if (!first.Found) return first; var second = Find(first.After(), right, caseInsensitive); if (!second.Found) return first; return Find(where, left + second.Before() + right, caseInsensitive); } } class Program { static void Main(string[] args) { var txt = "The brown fox jumped over the lazy dog"; var found = StringFinder.Find(txt, "FOX", caseInsensitive: true); if (found) { Console.WriteLine("->" + found.Before() + "<-"); Console.WriteLine("->" + found.After() + "<-"); Console.WriteLine("->" + found.TakeBackward(count: 5, skip: 1) + "<-"); Console.WriteLine("->" + found.TakeForward(count: 6, skip: 1) + "<-"); Console.WriteLine("->" + found.What + "<-"); } else { Console.WriteLine("Not found!"); } found = StringFinder.Between(txt, "brown", "jumped"); Console.WriteLine("->" + found.Before() + "<-"); Console.WriteLine("->" + found.After() + "<-"); Console.WriteLine("->" + found.What + "<-"); } } }