Wie kann die Leistung regulärer Ausdrücke optimiert werden?

7

Ich habe einen sehr langen regulären Ausdruck. Meine Regex ist eine Kombination aus etwa 5000 oder mehr Phrasen.

Auch der Text, auf dem ich den Regex ausführe, ist ebenfalls riesig. Die Textgröße beträgt etwa 5 KB.

Da Regex und der Eingabetext sehr groß sind, dauert es mindestens 2 Minuten, um die Regex auszuführen, was in meinem Projekt nicht akzeptabel ist.

Ich würde also gerne wissen, wie ich das optimieren kann. Eine Möglichkeit, an die ich denken kann, besteht darin, die Regex zu teilen und mehrere Threads zu verwenden, um die Ausführungszeit zu minimieren. Ist das die richtige Option oder gibt es eine andere Möglichkeit?

Ein Teil meiner Regex sieht so aus:

  

(ACS | ADDR.com Technologien | ADP private limited | ADP | ADP India limited | AIT Software Services | PTE limited | AMK Technologies limited | ANSoft Technologies limited | ANZ Information Technology limited | ASD | ASD India Private Limited | ASM Technologies Limited | AXA Group Solutions India Limited | AXA Technology Limited | Aarkay Infonet Limited | AbsolutData Research und Analytik Limited | Accenture India Limited | Accenture Services Indien | Accenture Services P Limited | Accenture Services Private Limited | Accenture | Accenture Private Limited | Accurum India Limited | AceTechnologies Inc | Aclat Inc. | AcmeCeeYess Softech Private Limited | Adaequare India GmbH | Adaequare Info Privat Limited | Adea International GmbH | Adea Technologies | Adeptra | Aditi Technologies | Adobe Adroit Business Solutions | Adroit und Claretdene Infotech Limited | Affron Infotech | Agile Software Enter price limited | Agrobent Technologies International limited | Akebono Soft Technologies limited | AkebonoSoft Technologies limited | Akmin Technologies | Algorhythm Technologies Limited | Allsec Technologies limited | Alfonso Informex limited | Altria | Aldustria | Amdocs Development Center Indien private limited | Amdocs Development Center Indien | American CyberSystems | American Express Service Indien private limited | Amerikanische Börse | Amrok Securities | Anish Informationstechnologie private limited | Ankhnet Informationen limited | Apex Technologies limited | AppLabs | AppLabs Technologies private limited | Atshark India | Apptix Software GmbH | Aquila Technologies | Arcot R & D Software limited | Arsin Systems limited | Ascendum Solutions limited | AskMe Software limited | Atos Origin limited | Atos Origin | Aurigo Software Technologie s private limited | Aurona Technologies GmbH | Autopower Software Solutions | Aztecsoft | BMC Software India limited | Balasai Net GmbH | Bayon Solutions limited | Beachwood Limited | Birlasoft limited | Blue Bird Technologies limited | Blue Fountain Media limited | Blue Star InfoTech | Boden Inc. | Boston | Braaham Net Solutions Limited | Braahmam Net Solutions Limited | Brain Soft Technologie | Private Limited | Brigade Corporation Private Limited | Business Link Automation Indien | Private Limited | BusinessLink Automation | Private Limited | C Ahead Info Technologies India Private limited | CDI Corporation | CCG Indien private limited | CEM Solutions | CGI Information Systems und Management Consultants private limited | CGI Information Systems private limited | CGI Information System und Management Consultants private limited | CGI Information und Management private limited | CGI Networks | CISCO Systems Indien private begrenzt | CMC Limited | COMSYS Inc. | CORE SHELL TECHNO LOGICS | CRC Software India GmbH | CSV India Private Limited | CSS Corp GmbH | Cambridge Solutions Limited | Cambridge Solutions | Cambridge Solutions Sdn. Bhd | Candor Ind. Private begrenzte | Candor India private limited | Canvas Creatives private begrenzt | Canvera | Capgemini Business Service India Limited | Capgemini private)

Ich benutze C # für dieses Zeug.

Bitte erleuchten !!!!

    
Shekhar 02.05.2011, 06:23
quelle

5 Antworten

8

Sie können die Leistung dieser Regex erheblich verbessern, indem Sie \b am Anfang voranstellen:

%Vor%

Dies verhindert eine Überprüfung jedes Zeichens und überprüft stattdessen jedes Wort.

    
Kobi 02.05.2011, 07:09
quelle
7

Sie können einen regulären Ausdruck optimieren, indem Sie die atomare Gruppierung verwenden oder Zeichenklassen (wenn möglich wieder).

Für spezifischere Antworten müssen Sie Ihre Regex veröffentlichen.

Viel Glück!

    
Bart Kiers 02.05.2011 06:28
quelle
7

Eine Optimierung wäre, gängige Präfixe zu extrahieren. Ändern Sie Vorkommen wie

%Vor%

bis

%Vor%

Dies sollte auch auf jeder Ebene geschehen. Ändern Sie Vorkommen wie

%Vor%

bis

%Vor%

Diese Optimierung ist so, dass die Regex-Engine nicht mehrfach auf dieselben Zeichen testen muss.

Dies kann erreicht werden, indem man die Phasen sortiert und aufeinander folgende Elemente betrachtet. Achten Sie darauf, nicht bei Meta-Zeichen zu teilen. Sie möchten nicht in der Mitte von .* oder \. aufteilen.

Eine andere Möglichkeit wäre, eine Trie-Struktur zu verwenden, um die Präfixe zu finden. Dies ist robuster, aber etwas komplizierter.

    
Markus Jarderot 02.05.2011 06:34
quelle
2

Ich weiß, es ist alt, aber immer noch ...

"OR" -Regeln (in diesem Fall alle Standardregeln: concat, repeat und or) müssen nicht manuell optimiert werden. Während der Kompilierung werden die meisten Regexp-Engines es optimieren. Manchmal ist das Gegenteil der Fall - zu viele Gruppen können Auswirkungen auf die Leistung haben, da die Engine die Übereinstimmung jeder Gruppe speichern muss.

Was die Leistung wirklich hart trifft, ist vorausschauend und hinter Regeln zu schauen, die in Ihrer Anfrage nicht verwendet werden.

In diesem Fall könnte der Autor am Anfang und am Ende der Abfrage die Regel '\ b' hinzufügen, um die Suche nach ganzen Wörtern zu erfordern, was die Anzahl der Stellen, an denen die Suchmaschine beginnen würde, erheblich einschränken würde.

    
Kaplan Ilya 14.10.2013 10:09
quelle
0

Ein Beispiel mit Python (es gibt auch ein C-Tool, um reguläre Ausdrücke in Ссылка ) zu optimieren:

%Vor%

Der ursprüngliche String hat die Länge 3399 . Je größer der String wird, desto mehr Optimierungen sind möglich. Dies verwendet die hachoir-regex -Bibliothek . Sie können dies zusätzlich zum Hinzufügen von \b verwenden, wie vorgeschlagen.

    
serv-inc 10.09.2017 10:09
quelle

Tags und Links