public virtual string ToUnicodeCategoryString(RegexUnicodeCategoryNode unicodeCategoryNode)
        {
            if (!IsUnicodeCategorySupported)
            {
                throw new UnicodeCategoryNotSupportedException(RegexLanguage);
            }
            if (unicodeCategoryNode == null)
            {
                throw new ArgumentNullException(nameof(unicodeCategoryNode));
            }

            var sb = new StringBuilder();

            if (!unicodeCategoryNode.Negative)
            {
                sb.Append(ToTokenString(RegexToken.UnicodeCategoryOpen))
                .Append(unicodeCategoryNode.Pattern)
                .Append(ToTokenString(RegexToken.UnicodeCategoryClose));
            }
            else
            {
                sb.Append(ToTokenString(RegexToken.NegativeUnicodeCategoryOpen))
                .Append(unicodeCategoryNode.Pattern)
                .Append(ToTokenString(RegexToken.NegativeUnicodeCategoryClose));
            }

            return(AddQuantifier(sb.ToString(), unicodeCategoryNode.Minimum, unicodeCategoryNode.Maximum, unicodeCategoryNode.RegexQuantifierOption));
        }
        /// <summary>
        /// Add an existing <see cref="RegexUnicodeCategoryNode"/> to the generator.
        /// <seealso cref="RegexUnicodeCategoryNode"/>
        /// </summary>
        /// <param name="unicodeCategory"><see cref="RegexUnicodeCategoryNode"/> to be added.</param>
        /// <returns><see cref="RegexGenerator"/></returns>
        /// <exception cref="UnicodeCategoryNotSupportedException">Unicode category is not supported by <see cref="RegexLanguage"/>.</exception>
        public RegexGenerator AddUnicodeCategory(RegexUnicodeCategoryNode unicodeCategory)
        {
            if (!IsUnicodeCategorySupported)
            {
                throw new UnicodeCategoryNotSupportedException(RegexLanguage);
            }

            return(Add(unicodeCategory));
        }
        /// <summary>
        /// Create and add <see cref="RegexUnicodeCategoryNode"/> to the generator.
        /// <seealso cref="RegexUnicodeCategoryNode(string, bool, int?, int?, RegexQuantifierOption)"/>
        /// <seealso cref="AddUnicodeCategory(RegexUnicodeCategoryNode)"/>
        /// </summary>
        /// <param name="unicodeDesignation">Unicode designation or named block.</param>
        /// <param name="negative">Optional value to determine if negate the category.</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="UnicodeCategoryNotSupportedException">Unicode category is not supported by <see cref="RegexLanguage"/>.</exception>
        public RegexGenerator AddUnicodeCategory(string unicodeDesignation, bool negative = false, int?min = null, int?max = null, RegexQuantifierOption quantifierOption = RegexQuantifierOption.Greedy)
        {
            var unicodeCategoryNode = new RegexUnicodeCategoryNode(unicodeDesignation, negative, min, max, quantifierOption);

            return(AddUnicodeCategory(unicodeCategoryNode));
        }