Regex dauert überraschend lange

Ich habe einen Suchbegriff von einem Benutzer eingegeben. Normalerweise wird die Suchzeichenfolge mit Leerzeichen aufgeteilt und anschließend eine ODER-Suche durchgeführt (ein Element stimmt überein, wenn es mit einem der Suchzeichenfolgenelemente übereinstimmt). Ich möchte einige "erweiterte" Abfragefunktionen bereitstellen, z. B. die Möglichkeit, Anführungszeichen zu verwenden, um wörtliche Ausdrücke mit Leerzeichen einzuschließen.

Ich dachte, ich hätte ein anständiges Regex herausgearbeitet, um die Saiten für mich aufzuteilen, aber die Ausführung dauert erstaunlich lange (> 2 Sekunden auf meinem Computer). Ich habe es ausgebrochen, um herauszufinden, wo der Schluckauf war, und was noch interessanter ist, es scheint nach dem letzten aufzutretenMatch wird abgeglichen (vermutlich am Ende der Eingabe). Alle Übereinstimmungen bis zum Ende der Zeichenfolge stimmen in kürzerer Zeit überein, als ich erfassen kann, aber das letzte Übereinstimmen (wenn es das ist - nichts kehrt zurück) dauert fast alle 2 Sekunden.

Ich hatte gehofft, jemand könnte einen Einblick bekommen, wie ich diesen regulären Ausdruck etwas beschleunigen kann. Ich weiß, dass ich einen Lookbehind mit einem unbegrenzten Quantifizierer verwende, aber wie ich bereits sagte, scheint dies erst nach dem Matching des letzten Matches zu Performance-Problemen zu führen.

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

        }
    }
}

AUSGABE
(Genau das bekomme ich.)

ein
"zwei drei"
vier
fünf, sechs, sieben"
acht
"neun zehn"

Antworten auf die Frage(1)

Ihre Antwort auf die Frage