Udger.Parser.PerlRegExpConverter.ConvertReplacement C# (CSharp) Method

ConvertReplacement() private method

Converts substitutions of the form \\xx to $xx (perl to .NET format).
private ConvertReplacement ( string replacement ) : string
replacement string String possibly containing \\xx substitutions.
return string
        private string ConvertReplacement(string replacement)
        {
            StringBuilder result = new StringBuilder();
            int[] group_numbers = regex.GetGroupNumbers();
            int max_number = (group_numbers.Length > 0) ? group_numbers[group_numbers.Length - 1] : 0;

            int i = 0;
            while (i < replacement.Length)
            {
                if (IsDigitGroupReference(replacement, i) ||
                  IsParenthesizedGroupReference(replacement, i))
                {
                    int add = 0;
                    i++;

                    if (replacement[i] == '{') { i++; add = 1; }

                    int number = replacement[i++] - '0';
                    if (i < replacement.Length && Char.IsDigit(replacement, i))
                    {
                        number = number * 10 + replacement[i];
                        i++;
                    }

                    // insert only existing group references (others replaced with empty string):
                    if (number <= max_number)
                    {
                        result.Append('$');
                        result.Append('{');
                        result.Append(number.ToString());
                        result.Append('}');
                    }

                    i += add;
                }
                else if (replacement[i] == '$')
                {
                    // there is $ and it is not a substitution - duplicate it:
                    result.Append("$$");
                    i++;
                }
                else if (replacement[i] == '\\' && i + 1 < replacement.Length)
                {
                    if (replacement[i + 1] == '\\')
                    {
                        // two backslashes, replace with one:
                        result.Append('\\');
                        i += 2;
                    }
                    else
                    {
                        // backslash + some character, skip two characters
                        result.Append(replacement, i, 2);
                        i += 2;
                    }
                }
                else
                {
                    // no substitution, no backslash (or backslash at the end of string)
                    result.Append(replacement, i++, 1);
                }
            }

            return result.ToString();
        }