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% ()
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.
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:
Tags und Links regex