/// <summary>
        /// Capture index number 0 is the entire match. Capture
        /// index 1 is the first matched group from the left, and so on.
        /// </summary>
        /// <param name="input">The input.</param>
        /// <param name="regularExpression">The regular expression.</param>
        /// <param name="captureIndex">Index of the capture.</param>
        /// <param name="options">The options.</param>
        /// <returns></returns>
        public static string Extract(string input, string regularExpression, int captureIndex, RegexOptions options)
        {
            Match m = Regex.Match(input, regularExpression, options);

            if (m.Success)
            {
                return(RegexUtilities.GetCapture(m, captureIndex));
            }
            return(null);
        }
        private static bool DoParse(string str, TzTimeZone localTimeZone, out TzDateTime result)
        {
            result = null;

            if (string.IsNullOrEmpty(str))
            {
                throw new ArgumentNullException("str");
            }

            Match m;
            int   matchIndex = RegexUtilities.MatchAny(str, out m,
                                                       FormatYear,
                                                       FormatYearAndMonth,
                                                       FormatComplete,
                                                       FormatCompleteHM,
                                                       FormatCompleteHMS,
                                                       FormatCompleteHMSF);
            int          year = 0, month = 1, day = 1, hours = 0, minutes = 0, seconds = 0, millisecond = 0;
            DateTimeKind kind     = DateTimeKind.Local;
            TzTimeZone   timezone = localTimeZone;

            if (matchIndex != -1)
            {
                if (matchIndex >= 0)
                {
                    year = int.Parse(RegexUtilities.GetCapture(m, 1));
                }
                if (matchIndex >= 1)
                {
                    month = int.Parse(RegexUtilities.GetCapture(m, 2));
                }
                if (matchIndex >= 2)
                {
                    day = int.Parse(RegexUtilities.GetCapture(m, 3));
                }
                if (matchIndex >= 3)
                {
                    hours   = int.Parse(RegexUtilities.GetCapture(m, 4));
                    minutes = int.Parse(RegexUtilities.GetCapture(m, 5));

                    // At this level, we also expect a time zone designator
                    kind = DateTimeKind.Utc;
                    string tzd = RegexUtilities.GetLastCapture(m, 2);
                    if (tzd == UtcZuluIdentifier.ToString())
                    {
                        timezone = TzTimeZone.ZoneUTC;
                    }
                    else
                    {
                        timezone = TzTimeZone.GetTimeZoneByOffset(RegexUtilities.GetLastCapture(m, 1));
                    }
                }
                if (matchIndex >= 4)
                {
                    seconds = int.Parse(RegexUtilities.GetCapture(m, 6));
                }
                if (matchIndex >= 5)
                {
                    millisecond = int.Parse(RegexUtilities.GetCapture(m, 7));
                }
                result = new TzDateTime(year, month, day, hours, minutes, seconds, millisecond, kind, timezone);
                return(true);
            }
            return(false);
        }