public virtual string ToConditionalString(RegexConditionalNode conditionalNode)
        {
            if (!IsConditionalSupported)
            {
                throw new ConditionalNotSupportedException(RegexLanguage);
            }
            if (conditionalNode == null)
            {
                throw new ArgumentNullException(nameof(conditionalNode));
            }

            var sb = new StringBuilder();

            sb.Append(ToTokenString(RegexToken.ConditionalOpen));
            if (string.IsNullOrWhiteSpace(conditionalNode.NameOrNumber))
            {
                sb.Append(ToTokenString(RegexToken.PositiveLookaheadAssertionOpen))
                .Append(conditionalNode.IsInnerNodeIncluded ? conditionalNode.InnerNode.ToString() : conditionalNode.Pattern)
                .Append(ToTokenString(RegexToken.PositiveLookaheadAssertionClose));
            }
            else
            {
                sb.Append(ToTokenString(RegexToken.GroupOpen))
                .Append(conditionalNode.NameOrNumber)
                .Append(ToTokenString(RegexToken.GroupClose));
            }
            sb.Append(conditionalNode.TrueValue)
            .Append(ToTokenString(RegexToken.Alternation))
            .Append(conditionalNode.FalseValue)
            .Append(ToTokenString(RegexToken.ConditionalClose));

            return(AddQuantifier(sb.ToString(), conditionalNode.Minimum, conditionalNode.Maximum, conditionalNode.RegexQuantifierOption));
        }
        /// <summary>
        /// Add an existing <see cref="RegexConditionalNode"/> to the generator.
        /// </summary>
        /// <param name="conditional"><see cref="RegexConditionalNode"/> to be added.</param>
        /// <returns><see cref="RegexGenerator"/></returns>
        /// <exception cref="ConditionalNotSupportedException">Conditional is not supported by <see cref="RegexLanguage"/>.</exception>
        public RegexGenerator AddConditional(RegexConditionalNode conditional)
        {
            if (!IsConditionalSupported)
            {
                throw new ConditionalNotSupportedException(RegexLanguage);
            }

            return(Add(conditional));
        }
        /// <summary>
        /// Create and add <see cref="RegexConditionalNode"/> to the generator, and include another <see cref="RegexNode"/> inside.
        /// </summary>
        /// <param name="innerNode">An existing <see cref="RegexNode"/> to be included.</param>
        /// <param name="trueValue">Value of successful match.</param>
        /// <param name="falseValue">Value of failed match.</param>
        /// <param name="nameOrNumber">Name or number for backtracking.</param>
        /// <param name="min">Optional minimum number of occurance.</param>
        /// <param name="max">Optional maximum number of occurance.</param>
        /// <param name="quantifierOption">Optional quantifier option.</param>
        /// <returns><see cref="RegexGenerator"/></returns>
        /// <exception cref="ConditionalNotSupportedException">Conditional is not supported by <see cref="RegexLanguage"/>.</exception>
        public RegexGenerator AddConditional(RegexNode innerNode, string trueValue, string falseValue, string nameOrNumber = null, int?min = null, int?max = null, RegexQuantifierOption quantifierOption = RegexQuantifierOption.Greedy)
        {
            var conditionalNode = new RegexConditionalNode(innerNode, trueValue, falseValue, nameOrNumber, min, max, quantifierOption);

            return(AddConditional(conditionalNode));
        }