Regex trwa zaskakująco długo

Mam wpisany przez użytkownika ciąg wyszukiwania. Normalnie ciąg wyszukiwania jest dzielony przy użyciu białych znaków, a następnie wykonywane jest wyszukiwanie OR (element pasuje, jeśli pasuje do któregokolwiek z elementów wyszukiwanego ciągu). Chcę udostępnić kilka „zaawansowanych” funkcji zapytań, takich jak możliwość używania cudzysłowów do umieszczania dosłownych fraz zawierających białe znaki.

Myślałem, że wytworzyłem przyzwoite wyrażenie regularne, aby podzielić struny dla mnie, ale wykonanie zaskakująco długiego czasu (> 2 sekundy na moim komputerze). Wyłamałem się, żeby dowiedzieć się, gdzie jest czkawka, a co jeszcze ciekawsze, wydaje się, że pojawia się po ostatnimMatch jest dopasowany (przypuszczalnie na końcu wejścia). Wszystkie mecze do końca łańcucha pasują w krótszym czasie niż ja mogę uchwycić, ale ten ostatni mecz (jeśli tak jest - nic nie powraca) zajmuje prawie wszystkie 2 sekundy.

Miałem nadzieję, że ktoś może mieć wgląd w to, jak mogę nieco przyspieszyć ten regex. Wiem, że używam szukacza z nieograniczonym kwantyfikatorem, ale, jak powiedziałem, wydaje się, że nie powoduje to żadnych problemów z wydajnością, dopóki nie zostanie dopasowany ostatni mecz.

KOD

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace RegexSandboxCSharp {
    class Program {
        static void Main( string[] args ) {

            string l_input1 = "# one  \"two three\" four five:\"six seven\"  eight \"nine ten\"";

            string l_pattern =
                @"(?<=^([^""]*([""][^""]*[""])?)*)\s+";

            Regex l_regex = new Regex( l_pattern );

            MatchCollection l_matches = l_regex.Matches( l_input1 );
            System.Collections.IEnumerator l_matchEnumerator = l_matches.GetEnumerator();

            DateTime l_listStart = DateTime.Now;
            List<string> l_elements = new List<string>();
            int l_previousIndex = 0;
            int l_previousLength = 0;
            //      The final MoveNext(), which returns false, takes 2 seconds.
            while ( l_matchEnumerator.MoveNext() ) {
                Match l_match = (Match) l_matchEnumerator.Current;
                int l_start = l_previousIndex + l_previousLength;
                int l_length = l_match.Index - l_start;
                l_elements.Add( l_input1.Substring( l_start, l_length ) );

                l_previousIndex = l_match.Index;
                l_previousLength = l_match.Length;
            }
            Console.WriteLine( "List Composition Time: " + ( DateTime.Now - l_listStart ).TotalMilliseconds.ToString() );

            string[] l_terms = l_elements.ToArray();

            Console.WriteLine( String.Join( "\n", l_terms ) );

            Console.ReadKey( true );

        }
    }
}

WYDAJNOŚĆ
(To jest dokładnie to, co dostaję.)

jeden
"dwa trzy"
cztery
pięć sześć siedem"
osiem
"dziewięć dziesięć"

questionAnswers(1)

yourAnswerToTheQuestion