2009-03-11 8 views
0

Ich habe den folgenden regulären Ausdruck in einem Projekt erzeugt, an dem ich arbeite, und es funktioniert gut, aber aus professioneller Neugier habe ich mich gefragt, ob es "komprimiert/verkürzt" werden kann:Hilfe Verkürzung eines regulären Ausdrucks mit wiederholten Untermustern

/[(]PRD[)].+;.+;.*;.+;.+;.*;.*;.*;/ 

Regexes haben schien immer wie Voodoo mir ...

+0

Nach was genau suchen Sie? z.B. Wie sieht das Suchergebnis aus? –

+0

Ja, wenn das Problem ist "pass genau, was diese Regex übereinstimmt", dann ist es schwer, es viel zu komprimieren. John war ziemlich gut in einem eleganteren Ansatz. Einige Beispiele von Match-Inhalten würden sehr hilfreich sein. – danieltalsky

Antwort

3

Für den Anfang, die Einzelzeichenblöcke einfach weg:

/\(PRD\).+;.+;.*;.+;.+;.*;.*;.*;/ 

Als nächstes y Sie können die zusammengehörigen Elemente zusammen gruppieren:

/\(PRD\)(.+;){2}.*;(.+;){2}(.*;){3}/ 

Das macht es tatsächlich jedoch länger textuell.

+0

ja, es ist länger, aber 50% mehr genial. ; P – Ash

+0

Und seit dem '.' sollte jedes Mal "[^;]" sein, dann wird die Überarbeitung viel kürzer - etwa 15 Zeichen kürzer als das geänderte Original. –

+0

Es könnte auch ein Argument sein, dass die '(...)' Sequenzen '(?: ...)' (nicht erfassende Gruppierungen) sein sollten, da das Original keine Captures enthielt. Es gibt ein weiteres Argument, dass das Original wahrscheinlich die Gruppierungen möchte, aber dann wäre es eine Frage, ob es besser ist, auf ';' zu splitten. –

2
/\(PRD\).+;.+;.*;.+;.+;(.*;){3}/ 

Ich glaube nicht, dass Sie viel gewinnen und die gleichen genauen Regeln erreichen werden. Wenn Sie nicht den ganzen Text zwischen den ";" optional, dann könnten Sie:

/\(PRD\)(.*;){8}/ 
3
/\(PRD\)(.+;.+;.*;){2}(.*;){2}/ 

kürzer als

/\(PRD\)((.+;){2}.*;){2}(.*;){2}/ 

aber wohl weniger genial. Beide sind erfolgreich kleiner als

obwohl (nur wegen der Zeichenklassenänderung).

Oder man könnte auch gehen mit

/\(PRD\)(.+;.+;.*;){2}.*;.*;/ 

die kann die kürzeste sein, das Sie mit den gleichen Regeln zu bekommen.

+0

+1 kürzeste mit den gleichen Regeln - jetzt, wenn Sie die Regeln ein wenig verbiegen ... :) – eglasius

Verwandte Themen