2015-07-19 8 views
5

Sind optionale nicht einfangende Gruppen redundant?Sind nicht einfangende Gruppen redundant?

Ist die folgende regex:

(?:wo)?men 

semantisch äquivalent zu der folgenden Regex?

(wo)?men 
+0

Ich denke, das würde davon abhängen, wo Sie die Regex verwenden. Die Standard-Regex-Strings von Java könnten dies erfordern, während ich mir ziemlich sicher bin, dass Perls es für überflüssig halten würde. – thecoshman

+4

nicht-einfangende Gruppen sind schwer auf Prozessor (da es zusätzliche Verarbeitung erfordert), während die Erfassung von Gruppen sind schwer auf Speicher (da es viele Dinge speichern muss). Aber sie sind semantisch gleichbedeutend in dem Sinne, dass sie die gleichen Dinge, aber auf eine andere Art und Weise, zuordnen können. Sie können dies als Autos mit unterschiedlichen Motoren denken, aber beide dienen als ein Mittel zum Reiten. –

Antwort

7

Ihre (?:wo)?men und (wo)?men sind semantisch äquivalent, aber technisch unterschiedlich sind, nämlich die erste ist eine Nicht-Erfassung und die andere eine Erfassungsgruppe mit. Daher lautet die Frage: Warum verwenden Sie nicht erfassende Gruppen, wenn wir Captures haben?

Nicht-Capraturing-Gruppen sind manchmal hilfreich.

  1. Um eine übermäßige Anzahl von Rückreferenzierungen (denken Sie daran, dass es manchmal schwierig ist, Rückreferenzierungen höher als 9 zu verwenden) zu vermeiden
  2. Um zu vermeiden, das Problem mit 99 nummerierten Rückreferenzierungen Grenze (durch die Anzahl der nummerierten einfangenden Gruppen reduziert) (Quelle : Regular-expressions.info: Die meisten Regex-Varianten unterstützen bis zu 99 Erfassungsgruppen und zweistellige Rückreferenzen)
    HINWEIS Dies betrifft weder die Java-Regex-Engine noch PHP- oder .NET-Regex-Engines.
  3. Um lessen the overhead verursacht durch Speichern der Captures im Stapel
  4. Wir können mehr Gruppierungen zu bestehenden Regex hinzufügen, ohne die Reihenfolge der Erfassung von Gruppen zu ruinieren.

Es ist auch nur makes our matches cleaner:

Sie eine Nicht-Erfassung Gruppe können die organisatorischen oder Gruppierung Vorteile beizubehalten, aber ohne den Aufwand für den Fang.

scheint es nicht eine gute Idee, bestehende reguläre Ausdrücke erneut Faktor Erfassung zu nicht-einfangenden Gruppen zu konvertieren, da es may ruin the code oder zu viel Aufwand erfordert.

+0

Dieser Kommentar ist mehr eine Bearbeitung, meinst du nicht? –

+2

Beachten Sie, dass das 99-Rückverweisungslimit nicht für die Java-Regex-Engine gilt. Die Anzahl der Erfassungsgruppen in Java wird in * transient int capturingGroupCount * gespeichert, sodass theoretisch viele Rückreferenzen auftreten können, deren Anzahl jedoch durch die Speicherbeschränkungen begrenzt werden kann. –

+0

Ich versuche herauszufinden, über wie viel Overhead wir reden und welche Auswirkungen dies tatsächlich hat (Java und Javascript). Gibt es einen echten Vorteil bei der Verwendung von nicht erfassenden Gruppen in Bezug auf die Leistung? – runlevel0