Quantifizierer
Aktualisiert: Juli 2008
Quantifizierer geben an, wie viele Instanzen des vorherigen Elements (bei dem es sich um ein Zeichen, eine Gruppe oder eine Zeichenklasse handeln kann) in der Eingabe vorhanden sein müssen, damit eine Übereinstimmung festgestellt wird.
Quantifizierer in regulären .NET Framework-Ausdrücken
In der folgenden Tabelle sind die Quantifizierer aufgeführt, die von regulären .NET Framework-Ausdrücken unterstützt werden. Der Mengen n und m sind ganzzahlige Konstanten. Eine Beschreibung des Unterschieds zwischen "gierigen" und "trägen" Quantifizierern finden Sie im Abschnitt "Gierige und träge Quantifizierer" im Anschluss an diese Tabelle.
Quantifizierer |
Beschreibung |
---|---|
* |
Stimmt mit dem vorangehenden Element nicht oder mehrmals überein. Ist äquivalent zu {0,}. * ist ein gieriger Quantifizierer, dessen nicht gieriges Äquivalent *? ist. Der reguläre Ausdruck \b91*9*\b sucht beispielsweise nach Entsprechungen der Ziffer 9, die auf eine Wortgrenze folgen. Auf die 9 können keine oder mehrere Instanzen der Ziffer 1 folgen, auf die ihrerseits keine oder mehrere Instanzen der Ziffer 9 folgen können. Im folgenden Beispiel wird dieser reguläre Ausdruck veranschaulicht. Von den neun Ziffern in der Eingabezeichenfolge stimmen fünf mit dem Muster überein und vier nicht (95, 929, 9129 und 9919).
|
+ |
Stimmt mit dem vorangehenden Element mindestens einmal überein. Ist äquivalent zu {1,}. + ist ein gieriger Quantifizierer, dessen nicht gieriges Äquivalent +? ist. Der reguläre Ausdruck \ba(n)+\w*?\b sucht beispielsweise nach ganzen Wörtern, die mit dem Buchstaben a beginnen, auf den mindestens eine Instanz des Buchstaben n folgt. Im folgenden Beispiel wird dieser reguläre Ausdruck veranschaulicht. Der reguläre Ausdruck liefert die Wörter an, annual, announcement und antique als Ergebnis und erkennt erwartungsgemäß keine Übereinstimmung bei den Wörtern autumn und all.
|
? |
Stimmt mit dem vorangehenden Element nicht oder einmal überein. Ist äquivalent zu {0,1}. ? ist ein gieriger Quantifizierer, dessen nicht gieriges Äquivalent ?? ist. Der reguläre Ausdruck \ban?\b sucht beispielsweise nach ganzen Wörtern, die mit dem Buchstaben a beginnen, auf den keine oder eine Instanz des Buchstaben n folgt. Er sucht also nach den Wörtern a und an. Im folgenden Beispiel wird dieser reguläre Ausdruck veranschaulicht.
|
{n} |
Stimmt mit dem vorangehenden Element genau n-mal überein. {n} ist ein gieriger Quantifizierer, dessen nicht gieriges Äquivalent {n}? ist. Der reguläre Ausdruck \b\d+\,\d{3}\b sucht beispielsweise nach Übereinstimmungen einer Wortgrenze, auf die mindestens eine Dezimalziffer, drei Dezimalziffern und eine weitere Wortgrenze folgen. Im folgenden Beispiel wird dieser reguläre Ausdruck veranschaulicht.
|
{n,} |
Stimmt mit dem vorangehenden Element mindestens n-mal überein. {n,} ist ein gieriger Quantifizierer, dessen nicht gieriges Äquivalent {n}? ist. Der reguläre Ausdruck \b\d{2,}\b\D+ sucht beispielsweise nach Übereinstimmungen einer Wortgrenze, auf die mindestens zwei Ziffern, eine Wortgrenze und ein weiteres Zeichen folgen, bei dem es sich nicht um eine Ziffer handelt. Im folgenden Beispiel wird dieser reguläre Ausdruck veranschaulicht. Der reguläre Ausdruck liefert kein Ergebnis für den Ausdruck 7 days, da dieser nur eine Dezimalziffer enthält, er erkennt jedoch erfolgreich Übereinstimmungen mit den Ausdrücken 10 weeks und 300 years.
|
{n,m} |
Stimmt mit dem vorangehenden Element mindestens n-mal, jedoch nicht mehr als m-mal überein. {n,m} ist ein gieriger Quantifizierer, dessen nicht gieriges Äquivalent {n,m}? ist. Der reguläre Ausdruck (00\s){2,4} sucht beispielsweise nach zwei bis vier Vorkommen zweier 0-Ziffern, auf die ein Leerzeichen folgt. Im folgenden Beispiel wird dieser reguläre Ausdruck veranschaulicht. Beachten Sie, dass der letzte Abschnitt der Eingabezeichenfolge dieses Muster fünf Mal und nicht maximal vier Mal enthält. Der Anfangsabschnitt dieser Teilzeichenfolge (bis zum Leerzeichen und dem fünften Nullenpaar) stimmt mit dem regulären Ausdrucksmuster jedoch überein.
|
*? |
Stimmt mit dem vorangehenden Element nicht oder mehrmals, jedoch so wenige Male wie möglich überein. Dies ist ein träger Quantifizierer, der das Gegenstück zum gierigen Quantifizierer * darstellt. Der reguläre Ausdruck \b\w*?oo\w*?\b sucht beispielsweise alle Wörter, die die Zeichenfolge oo enthalten. Im folgenden Beispiel wird dieser reguläre Ausdruck veranschaulicht.
|
+? |
Stimmt mit dem vorangehenden Element einmal oder mehrmals, jedoch so wenige Male wie möglich überein. Dies ist ein träger Quantifizierer, der das Gegenstück zum gierigen Quantifizierer + darstellt. Der reguläre Ausdruck \b\w+?\b sucht beispielsweise ein oder mehrere durch Wortgrenzen getrennte Zeichen. Im folgenden Beispiel wird dieser reguläre Ausdruck veranschaulicht.
|
?? |
Stimmt mit dem vorangehenden Element nicht oder mehrmals, jedoch so wenige Male wie möglich überein. Dies ist ein träger Quantifizierer, der das Gegenstück zum gierigen Quantifizierer ? darstellt. Beispielsweise sucht der reguläre Ausdruck ^(\s)*(System.)??Console.Write(Line)??\(?? nach Übereinstimmungen mit den Zeichenfolgen Console.Write oder Console.WriteLine. Die Zeichenfolge kann auch System. vor Console enthalten, und eine öffnende Klammer kann auf sie folgen. Die Zeichenfolge muss am Anfang einer Zeile stehen, ihr kann jedoch ein Leerzeichen vorangehen. Im folgenden Beispiel wird dieser reguläre Ausdruck veranschaulicht.
|
{n}? |
Stimmt genau n-mal mit dem vorangehenden Element überein. Dies ist ein träger Quantifizierer, der das Gegenstück zum gierigen Quantifizierer {n}+ darstellt. Der reguläre Ausdruck \b(\w{3,}?\.){2}?\w{3,}?\b sucht beispielsweise nach genau zwei Sätzen von Zeichen, auf die ein Punkt an einer Wortgrenze folgt. Auf diesen folgt dann ein weiterer Satz von Zeichen und eine Wortgrenze. Dieser reguläre Ausdruck soll eine Websiteadresse identifizieren. Im folgenden Beispiel wird der reguläre Ausdruck veranschaulicht. Beachten Sie, dass Übereinstimmungen mit www.microsoft.com und mdsn.microsoft.com erkannt werden, jedoch nicht mit mywebsite oder mycompany.com.
|
{n,}? |
Stimmt mit dem vorangehenden Element mindestens n-mal, jedoch so wenige Male wie möglich überein. Dies ist ein träger Quantifizierer, der das Gegenstück zum gierigen Quantifizierer {n,} darstellt. Beachten Sie zur Veranschaulichung das Beispiel für den {n}?-Quantifizierer. Der reguläre Ausdruck in diesem Beispiel verwendet den {n,}-Quantifizierer, um nach einer Zeichenfolge zu suchen, die mindestens drei Zeichen enthält, auf die ein Punkt folgt. |
{n,m}? |
Stimmt mit dem vorangehenden Element n-mal bis m-mal, jedoch so wenige Male wie möglich, überein. Dies ist ein träger Quantifizierer, der das Gegenstück zum gierigen Quantifizierer {n,m} darstellt. Der reguläre Ausdruck \b[A-Z](\w*?\s*?){1,10}[.!?] sucht beispielsweise nach Sätzen, die zwischen einem und zehn Wörtern enthalten. Er sucht nach einer Wortgrenze gefolgt von einem Großbuchstaben, auf den ein bis zehn Wiederholungen von keinen oder mehreren Wortzeichen und optional ein Leerzeichen folgen. Die Übereinstimmung wird dann von einem Punkt, einem Ausrufezeichen oder einem Fragezeichen beendet. Im folgenden Beispiel wird dieser reguläre Ausdruck veranschaulicht. Er liefert alle Sätze der Eingabezeichenfolge als Ergebnis mit Ausnahme eines einzigen Satzes, der 18 Wörter enthält.
|
Gierige und träge Quantifizierer
Einige Quantifizierer kommen in zwei Versionen vor:
Eine gierige Version.
Ein gieriger Quantifizierer sucht nach Übereinstimmungen mit dem Element, für das er so oft wie möglich gilt.
Eine nicht gierige bzw. träge Version.
Ein nicht gieriger Quantifizierer sucht nach Übereinstimmungen mit dem Element, für das er so wenige Male wie möglich gilt.
Um den Unterschied zu veranschaulichen, betrachten Sie z. B. einen sehr einfachen regulären Ausdruck, der die letzten vier Ziffern einer Zahlenfolge, wie z. B. einer Kreditkartennummer, extrahieren soll. Die Version des regulären Ausdrucks, der den gierigen Quantifizierer * verwendet, lautet \b.*([0-9]{4})\b. Bei einer gegebenen Zeichenfolge, die zwei Zahlen enthält, werden von ihm jedoch nur die letzten vier Ziffern der zweiten Zahl angezeigt, wie im folgenden Beispiel veranschaulicht.
Dim greedyPattern As String = "\b.*([0-9]{4})\b"
Dim input1 As String = "1112223333 3992991999"
For Each match As Match In Regex.Matches(input1, greedypattern)
Console.WriteLine("Account ending in ******{0}.", match.Groups(1).Value)
Next
' The example displays the following output:
' Account ending in ******1999.
string greedyPattern = @"\b.*([0-9]{4})\b";
string input1 = "1112223333 3992991999";
foreach (Match match in Regex.Matches(input1, greedyPattern))
Console.WriteLine("Account ending in ******{0}.", match.Groups[1].Value);
// The example displays the following output:
// Account ending in ******1999.
Dies ist nicht das gewünschte Verhalten. Der reguläre Ausdruck liefert kein Ergebnis für die erste Zahl, da der *-Quantifizierer in der gesamten Zeichenfolge nach so vielen Überereinstimmungen des vorangehenden Elements wie möglich sucht, und daher eine Entsprechung am Ende der Zeichenfolge feststellt.
Der entsprechende reguläre Ausdruck, der den trägen Quantifizierer *? verwendet, liefert das erwartete Verhalten, wie im folgenden Beispiel veranschaulicht.
Dim lazyPattern As String = "\b.*?([0-9]{4})\b"
Dim input2 As String = "1112223333 3992991999"
For Each match As Match In Regex.Matches(input2, lazypattern)
Console.WriteLine("Account ending in ******{0}.", match.Groups(1).Value)
Next
' The example displays the following output:
' Account ending in ******3333.
' Account ending in ******1999.
string lazyPattern = @"\b.*?([0-9]{4})\b";
string input2 = "1112223333 3992991999";
foreach (Match match in Regex.Matches(input2, lazyPattern))
Console.WriteLine("Account ending in ******{0}.", match.Groups[1].Value);
// The example displays the following output:
// Account ending in ******3333.
// Account ending in ******1999.
In den meisten Fällen geben reguläre Ausdrücke mit gierigen und trägen Quantifizierern die gleichen Übereinstimmungen zurück. Normalerweise geben sie unterschiedliche Ergebnisse zurück, wenn sie mit dem Punktmetazeichen (.) verwendet werden, das einem beliebigen Zeichen entspricht.
Siehe auch
Weitere Ressourcen
Sprachelemente für reguläre Ausdrücke
Änderungsprotokoll
Date |
Versionsgeschichte |
Grund |
---|---|---|
Juli 2008 |
Gründlich überarbeitet. |
Korrektur inhaltlicher Fehler. |