/// <summary>
        /// Rename the specified input, using the relativeCount.
        /// </summary>
        /// <param name="input">Input String to rename.</param>
        /// <param name="relativeCount">Relative count. This can be used for enumeration.</param>
        /// <returns>A new string renamed according to the rename operation's rules.</returns>
        public RenameResult Rename(string input, int relativeCount)
        {
            if (string.IsNullOrEmpty(input))
            {
                return(new RenameResult());
            }

            RenameResult renameResult;

            if (string.IsNullOrEmpty(this.SearchString))
            {
                renameResult = new RenameResult();
                renameResult.Add(new Diff(input, DiffOperation.Equal));
                return(renameResult);
            }

            MatchCollection matches;

            try
            {
                // Regex gives us case sensitivity, even when not searching with regex.
                var regexOptions = this.SearchIsCaseSensitive ? default(RegexOptions) : RegexOptions.IgnoreCase;
                matches = Regex.Matches(input, this.SearchStringAsRegex, regexOptions);
            }
            catch (System.ArgumentException)
            {
                renameResult = new RenameResult();
                renameResult.Add(new Diff(input, DiffOperation.Equal));
                return(renameResult);
            }

            renameResult = RenameResultUtilities.CreateDiffFromReplacedMatches(input, this.ReplaceMatch, matches);
            return(renameResult);
        }
        /// <summary>
        /// Rename the specified input, using the relativeCount.
        /// </summary>
        /// <param name="input">Input String to rename.</param>
        /// <param name="relativeCount">Relative count. This can be used for enumeration.</param>
        /// <returns>A new string renamed according to the rename operation's rules.</returns>
        public RenameResult Rename(string input, int relativeCount)
        {
            if (string.IsNullOrEmpty(input))
            {
                return(RenameResult.Empty);
            }

            var parseNumbersRegex = "([0-9]+)";

            var regex   = new Regex(parseNumbersRegex);
            var matches = regex.Matches(input);

            var fullReplacementResult = RenameResultUtilities.CreateDiffFromReplacedMatches(input, this.ReplaceMatch, matches);
            var renameResult          = RenameResultUtilities.GetDiffResultFromStrings(input, fullReplacementResult.Result);

            return(renameResult);
        }
        /// <summary>
        /// Rename the specified input, using the relativeCount.
        /// </summary>
        /// <param name="input">Input String to rename.</param>
        /// <param name="relativeCount">Relative count. This can be used for enumeration.</param>
        /// <returns>A new string renamed according to the rename operation's rules.</returns>
        public RenameResult Rename(string input, int relativeCount)
        {
            if (string.IsNullOrEmpty(input))
            {
                return(RenameResult.Empty);
            }

            var inputCaseChanged = string.Empty;

            if (!string.IsNullOrEmpty(this.DelimiterCharacters))
            {
                // We use regex instead of string.Split simply because the results can include the delimiters using capture groups
                var delimiterCharArray = this.DelimiterCharacters.ToCharArray();
                var patternBuilder     = new System.Text.StringBuilder();
                patternBuilder.Append("([");
                foreach (var delimiterChar in delimiterCharArray)
                {
                    // Dashes don't get escaped but are treated as a special character... need to escape them manually
                    if (delimiterChar == '-')
                    {
                        patternBuilder.Append("\\-");
                    }
                    else
                    {
                        patternBuilder.Append(Regex.Escape(delimiterChar.ToString()));
                    }
                }
                patternBuilder.Append("])");
                string pattern = patternBuilder.ToString();

                string[] words = Regex.Split(input, pattern);
                var      changedStringBuilder = new System.Text.StringBuilder();
                foreach (var word in words)
                {
                    if (!string.IsNullOrEmpty(word))
                    {
                        // Do not capitalize the delimiter characters
                        if (word.Length == 1 && this.DelimiterCharacters.Contains(word))
                        {
                            changedStringBuilder.Append(word);
                        }
                        else
                        {
                            var isFirstWord    = word == words[0];
                            var useLowerCasing = isFirstWord && this.UseCamel;
                            changedStringBuilder.Append(this.UpperOrLowerFirstChar(word, useLowerCasing));
                        }
                    }
                }

                inputCaseChanged = changedStringBuilder.ToString();
            }
            else
            {
                inputCaseChanged = input;
            }

            var renameResult = RenameResultUtilities.GetDiffResultFromStrings(input, inputCaseChanged);

            return(renameResult);
        }