2016-03-21 8 views
-1

hallo das ist mein C++ regexC++ Regex Geschwindigkeit optimieren

regex MyRGX(R"~((\w*)\s*[(]([^;]*)[)]\s*[;])~"); 

und dies ist mein String

Data1 (

    anything1 

); 

diese Regex erhalten Data1 und alles existiert zwischen (); mit jeder Bedingung. aber wenn ich mehr als 50 Blöcke wie Data1 habe, wird diese Regex-Suchgeschwindigkeit niedriger sein als äquivalente Regex in pcre. Ich denke, dass diese Regex, die ich habe, nicht für die Geschwindigkeit optimiert ist. Hast du irgendeinen Vorschlag, die Geschwindigkeit dieser Regex mit diesen Bedingungen zu erhöhen (alles zwischen (); und ...)?

+1

Ihre Zeichenfolge sieht für mich nicht wie eine Zeichenfolge aus. – nwp

+0

Sie denken einfach, dass es ist. – Elh48

+0

Meine Vorschläge: Verwenden Sie nicht-einfangende Gruppen ('(? :)' 'anstelle von'() '), wenn möglich. Verwenden Sie '' '' '' 'wenn möglich (da' * 'mit der leeren Zeichenfolge übereinstimmt, gibt es mehr mögliche Verzweigungen als' + '). Und schließlich können Sie das ['optimize'-Flag] (http://en.cppreference.com/w/cpp/regex/basic_regex) im [Konstruktor] verwenden (http://en.cppreference.com/w/ cpp/regex/basic_regex/basic_regex), um eine optimalere Regex zu erhalten (auf Kosten einer langsameren Konstruktion). Ich könnte vorschlagen "regex r (R" ~ ((\ w +) \ s * [(] ([^;] *) [)] \ s * [;]) ~ ", regex_constants :: optimieren | regex_constants :: ECMAScript); '. – Cornstalks

Antwort

0

Wie ich von Ihrer vorherigen Frage vermutete, sieht dies wie ein Fall aus, in dem Regex nicht die logischste Lösung ist.

"Regex" kommt von "Regular Expressions", die "Regular Languages" beschreiben. Und Sprachen mit übereinstimmenden Klammern (wie C++ selbst) sind nicht regelmäßig. Nun, was wir "Regex" nennen, hat sich zu einigen nicht-regulären Sprachen entwickelt, aber das ist nicht optimal.

In diesem Fall sieht es so aus, als ob ein vollkommen gewöhnlicher Parser funktionieren würde. Wie ich es verstehe, ist das Ziel, nach etwas zwischen ( und ); zu suchen. Machen Sie also eine einfache Textsuche vorwärts für (, rückwärts für );. Überprüfen Sie, ob beide gefunden wurden und dass ( vor ); steht. Verwenden Sie dann das gefundene Indexpaar, um die Teilzeichenfolge zu extrahieren.

+0

Bieten Sie eine O (N) -Lösung an, die unter Verwendung von Standardbibliotheksfunktionen implementiert werden kann, für etwas, das nachweisbar eine O (N) -Bindung aufweist. Erhalte -1. – MSalters