internal IString LTRReplace(Regex regex, IString input, MatchAppendEvaluator evaluator, int count, int startat, bool needs_groups_or_captures)
        {
            this.needs_groups_or_captures = needs_groups_or_captures;

            Match m = Scan(regex, input, startat, input.Length);

            if (!m.Success)
            {
                return(input);
            }

            StringBuilder result  = new StringBuilder(input.Length * 2);
            int           ptr     = startat;
            int           counter = count;

            input.AppendTo(result, 0, ptr);

            do
            {
                if (count != -1)
                {
                    if (counter-- <= 0)
                    {
                        break;
                    }
                }
                if (m.Index < ptr)
                {
                    throw new SystemException("how");
                }
                int appendLen = m.Index - ptr;
                input.AppendTo(result, ptr, appendLen);
                evaluator(m, result);

                ptr = m.Index + m.Length;
                m   = m.NextMatch();
            } while (m.Success);

            input.AppendTo(result, ptr, input.Length - ptr);

            return(new WrappedStringBuilder(result));
        }
        internal IString RTLReplace(Regex regex, IString input, MatchEvaluator evaluator, int count, int startat)
        {
            Match m = Scan(regex, input, startat, input.Length);

            if (!m.Success)
            {
                return(input);
            }

            int ptr     = startat;
            int counter = count;

#if NET_2_1
            var pieces = new System.Collections.Generic.List <string> ();
#else
            StringCollection pieces = new StringCollection();
#endif

            pieces.Add(input.Substring(ptr));

            do
            {
                if (count != -1)
                {
                    if (counter-- <= 0)
                    {
                        break;
                    }
                }
                if (m.Index + m.Length > ptr)
                {
                    throw new SystemException("how");
                }
                pieces.Add(input.Substring(m.Index + m.Length, ptr - m.Index - m.Length));
                pieces.Add(evaluator(m).ToString());

                ptr = m.Index;
                m   = m.NextMatch();
            } while (m.Success);

            StringBuilder result = new StringBuilder();

            input.AppendTo(result, 0, ptr);
            for (int i = pieces.Count; i > 0;)
            {
                result.Append(pieces [--i]);
            }

            pieces.Clear();

            return(new WrappedStringBuilder(result));
        }