Regex принимает удивительно много времени

У меня есть строка поиска, введенная пользователем. Обычно строка поиска разделяется с использованием пробелов, а затем выполняется поиск ИЛИ (элемент соответствует, если он соответствует любому из элементов строки поиска). Я хочу предоставить несколько "продвинутых" функции запроса, такие как возможность использовать кавычки для включения буквальных фраз, содержащих пробелы.

Хотя я и придумал приличное регулярное выражение, чтобы разделить строки для меня, но это заняло удивительно много времени для выполнения (& gt; 2 секунды на моем компьютере). Я разбил его, чтобы выяснить, где был сбой, и еще более интересно, что это происходит после последнегоMatch совпадает (предположительно, в конце ввода). Все совпадения до конца строки совпадают за меньшее время, чем я могу перехватить, но это последнее совпадение (если это то, что есть - ничего не возвращается) занимает почти все 2 секунды.

Я надеялся, что кто-то может понять, как я могу немного ускорить это регулярное выражение. Я знаю, что использую просмотр сзади с неограниченным квантификатором, но, как я уже сказал, это, похоже, не вызывает проблем с производительностью до тех пор, пока не будет сопоставлено последнее совпадение.

CODE

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 );

        }
    }
}

OUTPUT
(Это именно то, что я получаю.)

one
"two three"
four
five:"six seven"
eight
"nine ten"

Ответы на вопрос(1)

Ваш ответ на вопрос