Was ist der Unterschied zwischen () und [] in einer Regex?

7

Sagen wir:

/(a|b)/ gegen /[ab]/

    
Cheng 28.10.2009, 05:35
quelle

3 Antworten

19

In Ihrem obigen Beispiel gibt es keinen großen Unterschied (in den meisten Sprachen). Der Hauptunterschied besteht darin, dass die () Version eine Gruppe erstellt, die durch in der Übereinstimmung (oder manchmal ) rückreferenziert werden kann. Die [] Version tut dies nicht.

Auch

%Vor%     
Peter 28.10.2009, 05:36
quelle
6

() im regulären Ausdruck wird für die Gruppierung regulärer Ausdrücke verwendet, sodass Sie Operatoren auf einen ganzen Ausdruck anstatt auf ein einzelnes Zeichen anwenden können. Wenn ich zum Beispiel den regulären Ausdruck ab habe, dann verweist ab* auf ein a , gefolgt von einer beliebigen Anzahl von b s (zB a , ab , abb , usw.) , (ab)* bezieht sich auf eine beliebige Anzahl von Wiederholungen der Sequenz ab (z. B. die leere Zeichenfolge, ab , abab usw.). In vielen Engines für reguläre Ausdrücke wird () auch zum Erstellen von Referenzen verwendet, auf die nach dem Abgleich verwiesen werden kann. Zum Beispiel, in Ruby, nachdem Sie "foo" =~ /f(o*)/ ausgeführt haben, enthält oo .

| in einem regulären Ausdruck zeigt Wechsel an; es bedeutet der Ausdruck vor dem Balken oder der Ausdruck danach. Sie können jede Ziffer mit dem Ausdruck 0|1|2|3|4|5|6|7|8|9 abgleichen. Häufig wird die Alternation in Klammern angezeigt, um einen Unterausdruck zu gruppieren oder zu erfassen. Dies ist jedoch nicht erforderlich. Sie können die Alternation auch für längere Ausdrücke verwenden, wie foo|bar , um entweder foo oder bar anzugeben.

Sie können jeden regulären Ausdruck ausdrücken (im formalen, theoretischen Sinne, nicht den erweiterten Sinn, den viele Sprachen verwenden), mit nur Alternation | , kleene closure * , Verkettung (nur zwei Ausdrücke nebeneinander schreiben mit nichts dazwischen) und Klammern für die Gruppierung. Bei komplizierten Ausdrücken wäre das jedoch eher unbequem, weshalb mehrere Shorthands verfügbar sind. Zum Beispiel ist x? nur eine Abkürzung für |x (dh die leere Zeichenfolge oder x ), während y+ eine Abkürzung für yy* ist.

[] sind im Grunde eine Abkürzung für den Wechsel | aller Zeichen oder Zeichenbereiche innerhalb des Codes. Wie gesagt, ich könnte 0|1|3|4|5|6|7|8|9 schreiben, aber es ist viel bequemer, [0-9] zu schreiben. Ich kann auch [a-zA-Z] schreiben, um einen beliebigen Buchstaben darzustellen. Beachten Sie, dass [] zwar eine Gruppierung bereitstellt, aber im Allgemeinen keine neue Referenz einführt, auf die später verwiesen werden kann. Sie müssten sie dafür in runde Klammern setzen, wie ([a-zA-Z])

Ihre beiden regulären Beispielausdrücke stimmen also überein, aber die (a|b) setzt die erste Unterübereinstimmung auf das übereinstimmende Zeichen, während [ab] keine Referenzen auf Unterübereinstimmungen erzeugt.

    
Brian Campbell 28.10.2009 06:02
quelle
5

Erstens, wenn Sie über Regexes sprechen, ist es oft wichtig zu spezifizieren, um welche Art von Regexes es sich handelt. Es gibt verschiedene Varianten (wie die traditionellen POSIX-Regexes, Perl- und Perl-kompatible Regexes (PCRE), etc.).

Unter der Annahme von PCRE oder etwas sehr ähnlichem, was heutzutage am häufigsten vorkommt, gibt es drei Hauptunterschiede:

  1. Mithilfe von Klammern können Sie Optionen prüfen, die aus mehr als einem Zeichen bestehen. So / (a ​​| b) / könnte stattdessen / (abc | defg) /.
  2. sein
  3. Klammerngruppen führen eine Erfassungsoperation aus, so dass Sie das Ergebnis extrahieren können (so dass, wenn es auf "b" übereinstimmt, Sie "b" zurückbekommen und das sehen können). / [ab] / nicht. Die Erfassungsoperation kann durch Hinzufügen von?: Wie folgt überschrieben werden: / (?: a | b) /
  4. Auch wenn Sie das Erfassungsverhalten von Klammern überschreiben, ist die zugrundeliegende Implementierung für [] möglicherweise noch schneller, wenn Sie einzelne Zeichen prüfen (obwohl nichts darauf hinweist, dass Nicht-Capturen (?: a | b) nicht als optimiert werden kann) ein Sonderfall in [ab], aber die Regex-Kompilierung kann etwas länger dauern).
Nicholas Knight 28.10.2009 05:45
quelle

Tags und Links