Reguläre Ausdrücke von .NET.NET regular expressions

Der Einsatz regulärer Ausdrücke stellt eine leistungsstarke, flexible und effiziente Methode zur Verarbeitung von Text dar.Regular expressions provide a powerful, flexible, and efficient method for processing text. Die umfangreiche Mustervergleichsnotation regulärer Ausdrücke ermöglicht es Ihnen, große Textmengen für folgende Zwecke schnell zu analysieren:The extensive pattern-matching notation of regular expressions enables you to quickly parse large amounts of text to:

  • Suchen nach bestimmten ZeichenmusternFind specific character patterns.
  • Überprüfen von Text, um sicherzustellen, dass er einem vordefinierten Muster (z. B. einer E-Mail-Adresse) entsprichtValidate text to ensure that it matches a predefined pattern (such as an email address).
  • Extrahieren, Bearbeiten, Ersetzen oder Löschen von Teilzeichenfolgen von TextExtract, edit, replace, or delete text substrings.
  • Hinzufügen von extrahierten Zeichenfolgen zu einer Sammlung, um einen Bericht zu generierenAdd extracted strings to a collection in order to generate a report.

Für viele Anwendungen, die mit Zeichenfolgen arbeiten oder große Textblöcke analysieren, sind reguläre Ausdrücke ein unverzichtbares Tool.For many applications that deal with strings or that parse large blocks of text, regular expressions are an indispensable tool.

Funktionsweise von regulären AusdrückenHow regular expressions work

Das Kernstück der Textverarbeitung mit regulären Ausdrücken ist die Engine für reguläre Ausdrücke, die durch das System.Text.RegularExpressions.Regex-Objekt in .NET dargestellt wird.The centerpiece of text processing with regular expressions is the regular expression engine, which is represented by the System.Text.RegularExpressions.Regex object in .NET. Für die Textverarbeitung mit regulären Ausdrücken ist mindestens erforderlich, dass die Engine für reguläre Ausdrücke mit den folgenden zwei Informationen bereitgestellt wird:At a minimum, processing text using regular expressions requires that the regular expression engine be provided with the following two items of information:

  • Das Muster des regulären Ausdrucks, das im Text identifiziert werden soll.The regular expression pattern to identify in the text.

    In .NET werden Muster für reguläre Ausdrücke durch eine spezielle Syntax oder Sprache definiert, die mit regulären Ausdrücken in Perl 5 kompatibel ist und einige zusätzliche Funktionen wie Mustervergleiche von rechts nach links bietet.In .NET, regular expression patterns are defined by a special syntax or language, which is compatible with Perl 5 regular expressions and adds some additional features such as right-to-left matching. Weitere Informationen finden Sie unter Sprachelemente für reguläre Ausdrücke – Kurzübersicht.For more information, see Regular Expression Language - Quick Reference.

  • Der Text, der nach dem Muster des regulären Ausdrucks analysiert werden soll.The text to parse for the regular expression pattern.

Mit den Methoden der Regex-Klasse können Sie die folgenden Vorgänge durchführen:The methods of the Regex class let you perform the following operations:

Eine Übersicht über das Objektmodell für reguläre Ausdrücke finden Sie unter Das Objektmodell für reguläre Ausdrücke.For an overview of the regular expression object model, see The Regular Expression Object Model.

Weitere Informationen über die Sprache für reguläre Ausdrücke finden Sie unter Sprachelemente für reguläre Ausdrücke – Kurzübersicht. Sie können auch eine der folgenden Broschüren herunterladen und ausdrucken:For more information about the regular expression language, see Regular Expression Language - Quick Reference or download and print one of these brochures:

Beispiele für reguläre AusdrückeRegular expression examples

Die String-Klasse enthält eine Reihe von Such- und Ersetzungsmethoden für Zeichenfolgen, die Sie verwenden können, wenn Sie Literalzeichenfolgen in einer größeren Zeichenfolge suchen möchten.The String class includes a number of string search and replacement methods that you can use when you want to locate literal strings in a larger string. Reguläre Ausdrücke sind besonders hilfreich, wenn Sie eine von mehreren Teilzeichenfolgen in einer größeren Zeichenfolge suchen oder wenn Sie Muster in einer Zeichenfolge identifizieren möchten, wie in den folgenden Beispielen veranschaulicht wird.Regular expressions are most useful either when you want to locate one of several substrings in a larger string, or when you want to identify patterns in a string, as the following examples illustrate.

Warnung

Übergeben Sie ein Timeout, wenn Sie System.Text.RegularExpressions zum Verarbeiten nicht vertrauenswürdiger Eingaben verwenden.When using System.Text.RegularExpressions to process untrusted input, pass a timeout. Ein böswilliger Benutzer kann Eingaben für RegularExpressions angeben, um einen Denial-of-Service-Angriff durchzuführen.A malicious user can provide input to RegularExpressions causing a Denial-of-Service attack. ASP.NET Core-Framework-APIs, die RegularExpressions verwenden, übergeben ein Timeout.ASP.NET Core framework APIs that use RegularExpressions pass a timeout.

Tipp

Der Namespace System.Web.RegularExpressions enthält eine Reihe von Objekten für reguläre Ausdrücke, die vordefinierte Muster für reguläre Ausdrucke zum Analysieren von Zeichenfolgen aus HTML-, XML- und ASP.NET-Dokumenten implementieren.The System.Web.RegularExpressions namespace contains a number of regular expression objects that implement predefined regular expression patterns for parsing strings from HTML, XML, and ASP.NET documents. Die Klasse TagRegex identifiziert beispielsweise Starttags in einer Zeichenfolge und die Klasse CommentRegex ASP.NET-Kommentare in einer Zeichenfolge.For example, the TagRegex class identifies start tags in a string and the CommentRegex class identifies ASP.NET comments in a string.

Beispiel 1: Ersetzen von TeilzeichenfolgenExample 1: Replace substrings

Angenommen, eine Mailingliste enthält neben dem Vor- und Nachnamen bei einigen Personen auch Angaben zur Anrede (Mr., Mrs., Miss oder Ms.).Assume that a mailing list contains names that sometimes include a title (Mr., Mrs., Miss, or Ms.) along with a first and last name. Wenn Sie Adressaufkleber aus der Liste generieren, die Anrede dabei jedoch unberücksichtigt lassen möchten, können Sie diese mithilfe eines regulären Ausdrucks entfernen, wie im folgenden Beispiel veranschaulicht wird.If you do not want to include the titles when you generate envelope labels from the list, you can use a regular expression to remove the titles, as the following example illustrates.

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      string pattern = "(Mr\\.? |Mrs\\.? |Miss |Ms\\.? )";
      string[] names = { "Mr. Henry Hunt", "Ms. Sara Samuels",
                         "Abraham Adams", "Ms. Nicole Norris" };
      foreach (string name in names)
         Console.WriteLine(Regex.Replace(name, pattern, String.Empty));
   }
}
// The example displays the following output:
//    Henry Hunt
//    Sara Samuels
//    Abraham Adams
//    Nicole Norris
Imports System.Text.RegularExpressions

Module Example
    Public Sub Main()
        Dim pattern As String = "(Mr\.? |Mrs\.? |Miss |Ms\.? )"
        Dim names() As String = {"Mr. Henry Hunt", "Ms. Sara Samuels", _
                                  "Abraham Adams", "Ms. Nicole Norris"}
        For Each name As String In names
            Console.WriteLine(Regex.Replace(name, pattern, String.Empty))
        Next
    End Sub
End Module
' The example displays the following output:
'    Henry Hunt
'    Sara Samuels
'    Abraham Adams
'    Nicole Norris

Das Muster für reguläre Ausdrücke (Mr\.? |Mrs\.? |Miss |Ms\.? ) entspricht jedem Vorkommen von „Mr “, „Mr. “, „Mrs “, „Mrs. “, „Miss “, „Ms “ oder „Ms. “.The regular expression pattern (Mr\.? |Mrs\.? |Miss |Ms\.? ) matches any occurrence of "Mr ", "Mr. ", "Mrs ", "Mrs. ", "Miss ", "Ms or "Ms. ". Wenn Sie die Regex.Replace-Methode aufrufen, wird die entsprechende Zeichenfolge durch String.Empty ersetzt, d. h., die Zeichenfolge wird aus der ursprünglichen Zeichenfolge entfernt.The call to the Regex.Replace method replaces the matched string with String.Empty; in other words, it removes it from the original string.

Beispiel 2: Identifizieren von doppelten WörternExample 2: Identify duplicated words

Das versehentliche Erstellen doppelter Wörter ist ein Fehler, der häufig von Entwicklern gemacht wird.Accidentally duplicating words is a common error that writers make. Mithilfe eines regulären Ausdrucks können Sie doppelte Wörter identifizieren, wie im folgenden Beispiel veranschaulicht wird.A regular expression can be used to identify duplicated words, as the following example shows.

using System;
using System.Text.RegularExpressions;

public class Class1
{
   public static void Main()
   {
      string pattern = @"\b(\w+?)\s\1\b";
      string input = "This this is a nice day. What about this? This tastes good. I saw a a dog.";
      foreach (Match match in Regex.Matches(input, pattern, RegexOptions.IgnoreCase))
         Console.WriteLine("{0} (duplicates '{1}') at position {2}",
                           match.Value, match.Groups[1].Value, match.Index);
   }
}
// The example displays the following output:
//       This this (duplicates 'This') at position 0
//       a a (duplicates 'a') at position 66
Imports System.Text.RegularExpressions

Module modMain
    Public Sub Main()
        Dim pattern As String = "\b(\w+?)\s\1\b"
        Dim input As String = "This this is a nice day. What about this? This tastes good. I saw a a dog."
        For Each match As Match In Regex.Matches(input, pattern, RegexOptions.IgnoreCase)
            Console.WriteLine("{0} (duplicates '{1}') at position {2}", _
                              match.Value, match.Groups(1).Value, match.Index)
        Next
    End Sub
End Module
' The example displays the following output:
'       This this (duplicates 'This') at position 0
'       a a (duplicates 'a') at position 66

Das Muster des regulären Ausdrucks \b(\w+?)\s\1\b kann wie folgt interpretiert werden:The regular expression pattern \b(\w+?)\s\1\b can be interpreted as follows:

MusterPattern InterpretationInterpretation
\b An einer Wortgrenze beginnen.Start at a word boundary.
(\w+?) Entspricht einem oder mehreren Wortzeichen, aber so wenigen Zeichen wie möglich.Match one or more word characters, but as few characters as possible. Zusammen bilden diese eine Gruppe, auf die mit \1 verwiesen werden kann.Together, they form a group that can be referred to as \1.
\s Entsprechung für ein Leerraumzeichen finden.Match a white-space character.
\1 Entsprechung für die Teilzeichenfolge finden, die gleich der Gruppe \1 ist.Match the substring that is equal to the group named \1.
\b Übereinstimmung mit einer Wortgrenze.Match a word boundary.

Die Regex.Matches-Methode wird aufgerufen, und die Optionen für den regulären Ausdruck sind auf RegexOptions.IgnoreCase festgelegt.The Regex.Matches method is called with regular expression options set to RegexOptions.IgnoreCase. Beim Abgleichvorgang spielt die Groß- und Kleinschreibung daher keine Rolle, und die Teilzeichenfolge "This this" wird im Beispiel als Duplikat identifiziert.Therefore, the match operation is case-insensitive, and the example identifies the substring "This this" as a duplication.

Die Eingabezeichenfolge enthält die Teilzeichenfolge „this?The input string includes the substring "this? This" enthält.This". Aufgrund des dazwischenliegenden Satzzeichens wird diese jedoch nicht als Duplikat identifiziert.However, because of the intervening punctuation mark, it is not identified as a duplication.

Beispiel 3: Dynamisches Erstellen eines kulturabhängigen regulären AusdrucksExample 3: Dynamically build a culture-sensitive regular expression

Das folgende Beispiel veranschaulicht die Leistungsfähigkeit regulärer Ausdrücke in Kombination mit der Flexibilität der .NET-Globalisierungsfunktionen.The following example illustrates the power of regular expressions combined with the flexibility offered by .NET's globalization features. Mit dem NumberFormatInfo-Objekt wird das Format von Währungswerten in der aktuellen Kultur des Systems bestimmt.It uses the NumberFormatInfo object to determine the format of currency values in the system's current culture. Anschließend wird anhand dieser Informationen dynamisch ein regulärer Ausdruck erstellt, der Währungswerte aus dem Text extrahiert.It then uses that information to dynamically construct a regular expression that extracts currency values from the text. Für jede Übereinstimmung wird die Untergruppe extrahiert, die nur die numerische Zeichenfolge enthält. Diese wird in einen Decimal-Wert konvertiert, und dann wird ein laufender Gesamtbetrag berechnet.For each match, it extracts the subgroup that contains the numeric string only, converts it to a Decimal value, and calculates a running total.

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      // Define text to be parsed.
      string input = "Office expenses on 2/13/2008:\n" +
                     "Paper (500 sheets)                      $3.95\n" +
                     "Pencils (box of 10)                     $1.00\n" +
                     "Pens (box of 10)                        $4.49\n" +
                     "Erasers                                 $2.19\n" +
                     "Ink jet printer                        $69.95\n\n" +
                     "Total Expenses                        $ 81.58\n";

      // Get current culture's NumberFormatInfo object.
      NumberFormatInfo nfi = CultureInfo.CurrentCulture.NumberFormat;
      // Assign needed property values to variables.
      string currencySymbol = nfi.CurrencySymbol;
      bool symbolPrecedesIfPositive = nfi.CurrencyPositivePattern % 2 == 0;
      string groupSeparator = nfi.CurrencyGroupSeparator;
      string decimalSeparator = nfi.CurrencyDecimalSeparator;

      // Form regular expression pattern.
      string pattern = Regex.Escape( symbolPrecedesIfPositive ? currencySymbol : "") +
                       @"\s*[-+]?" + "([0-9]{0,3}(" + groupSeparator + "[0-9]{3})*(" +
                       Regex.Escape(decimalSeparator) + "[0-9]+)?)" +
                       (! symbolPrecedesIfPositive ? currencySymbol : "");
      Console.WriteLine( "The regular expression pattern is:");
      Console.WriteLine("   " + pattern);

      // Get text that matches regular expression pattern.
      MatchCollection matches = Regex.Matches(input, pattern,
                                              RegexOptions.IgnorePatternWhitespace);
      Console.WriteLine("Found {0} matches.", matches.Count);

      // Get numeric string, convert it to a value, and add it to List object.
      List<decimal> expenses = new List<Decimal>();

      foreach (Match match in matches)
         expenses.Add(Decimal.Parse(match.Groups[1].Value));

      // Determine whether total is present and if present, whether it is correct.
      decimal total = 0;
      foreach (decimal value in expenses)
         total += value;

      if (total / 2 == expenses[expenses.Count - 1])
         Console.WriteLine("The expenses total {0:C2}.", expenses[expenses.Count - 1]);
      else
         Console.WriteLine("The expenses total {0:C2}.", total);
   }
}
// The example displays the following output:
//       The regular expression pattern is:
//          \$\s*[-+]?([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?)
//       Found 6 matches.
//       The expenses total $81.58.
Imports System.Collections.Generic
Imports System.Globalization
Imports System.Text.RegularExpressions

Public Module Example
    Public Sub Main()
        ' Define text to be parsed.
        Dim input As String = "Office expenses on 2/13/2008:" + vbCrLf + _
                              "Paper (500 sheets)                      $3.95" + vbCrLf + _
                              "Pencils (box of 10)                     $1.00" + vbCrLf + _
                              "Pens (box of 10)                        $4.49" + vbCrLf + _
                              "Erasers                                 $2.19" + vbCrLf + _
                              "Ink jet printer                        $69.95" + vbCrLf + vbCrLf + _
                              "Total Expenses                        $ 81.58" + vbCrLf
        ' Get current culture's NumberFormatInfo object.
        Dim nfi As NumberFormatInfo = CultureInfo.CurrentCulture.NumberFormat
        ' Assign needed property values to variables.
        Dim currencySymbol As String = nfi.CurrencySymbol
        Dim symbolPrecedesIfPositive As Boolean = CBool(nfi.CurrencyPositivePattern Mod 2 = 0)
        Dim groupSeparator As String = nfi.CurrencyGroupSeparator
        Dim decimalSeparator As String = nfi.CurrencyDecimalSeparator

        ' Form regular expression pattern.
        Dim pattern As String = Regex.Escape(CStr(IIf(symbolPrecedesIfPositive, currencySymbol, ""))) + _
                                "\s*[-+]?" + "([0-9]{0,3}(" + groupSeparator + "[0-9]{3})*(" + _
                                Regex.Escape(decimalSeparator) + "[0-9]+)?)" + _
                                CStr(IIf(Not symbolPrecedesIfPositive, currencySymbol, ""))
        Console.WriteLine("The regular expression pattern is: ")
        Console.WriteLine("   " + pattern)

        ' Get text that matches regular expression pattern.
        Dim matches As MatchCollection = Regex.Matches(input, pattern, RegexOptions.IgnorePatternWhitespace)
        Console.WriteLine("Found {0} matches. ", matches.Count)

        ' Get numeric string, convert it to a value, and add it to List object.
        Dim expenses As New List(Of Decimal)

        For Each match As Match In matches
            expenses.Add(Decimal.Parse(match.Groups.Item(1).Value))
        Next

        ' Determine whether total is present and if present, whether it is correct.
        Dim total As Decimal
        For Each value As Decimal In expenses
            total += value
        Next

        If total / 2 = expenses(expenses.Count - 1) Then
            Console.WriteLine("The expenses total {0:C2}.", expenses(expenses.Count - 1))
        Else
            Console.WriteLine("The expenses total {0:C2}.", total)
        End If
    End Sub
End Module
' The example displays the following output:
'       The regular expression pattern is:
'          \$\s*[-+]?([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?)
'       Found 6 matches.
'       The expenses total $81.58.

Im Beispiel wird dynamisch der reguläre Ausdruck \$\s*[-+]?([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?) auf einem Computer mit der aktuellen Kultur Englisch - USA (en-US) erstellt.On a computer whose current culture is English - United States (en-US), the example dynamically builds the regular expression \$\s*[-+]?([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?). Dieses Muster des regulären Ausdrucks kann wie folgt interpretiert werden:This regular expression pattern can be interpreted as follows:

MusterPattern InterpretationInterpretation
\$ Suche nach einem einzelnen Vorkommen des Dollarsymbols ($) in der Eingabezeichenfolge.Look for a single occurrence of the dollar symbol ($) in the input string. Die Musterzeichenfolge des regulären Ausdrucks schließt einen umgekehrten Schrägstrich ein, der angibt, dass das Dollarsymbol nicht als Anchor des regulären Ausdrucks, sondern wörtlich interpretiert werden soll.The regular expression pattern string includes a backslash to indicate that the dollar symbol is to be interpreted literally rather than as a regular expression anchor. (Das $-Symbol allein würde angeben, dass die Engine für reguläre Ausdrücke versuchen soll, mit der Suche nach Übereinstimmungen am Ende einer Zeichenfolge zu beginnen.) Um sicherzustellen, dass das Währungssymbol der aktuellen Kultur nicht als reguläres Ausdruckssymbol fehlinterpretiert wird, wird im Beispiel die Regex.Escape-Methode aufgerufen, um das Zeichen mit Escapezeichen zu versehen.(The $ symbol alone would indicate that the regular expression engine should try to begin its match at the end of a string.) To ensure that the current culture's currency symbol is not misinterpreted as a regular expression symbol, the example calls the Regex.Escape method to escape the character.
\s* Suche nach 0 (null) oder mehr Vorkommen eines Leerstellenzeichens.Look for zero or more occurrences of a white-space character.
[-+]? Suche nach 0 (null) oder einem Vorkommen entweder eines positiven oder eines negativen Vorzeichens.Look for zero or one occurrence of either a positive sign or a negative sign.
([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?) Die äußeren Klammern um diesen Ausdruck definieren ihn als Erfassungsgruppe oder Teilausdruck.The outer parentheses around this expression define it as a capturing group or a subexpression. Wenn eine Übereinstimmung gefunden wird, können Informationen über diesen Teil der übereinstimmenden Zeichenfolge aus dem zweiten Group-Objekt in dem GroupCollection-Objekt abgerufen werden, das von der Match.Groups-Eigenschaft zurückgegeben wird.If a match is found, information about this part of the matching string can be retrieved from the second Group object in the GroupCollection object returned by the Match.Groups property. (Das erste Element in der Auflistung stellt die gesamte Übereinstimmung dar.)(The first element in the collection represents the entire match.)
[0-9]{0,3} Suche nach 0 (null) bis drei Vorkommen der Dezimalstellen 0 bis 9.Look for zero to three occurrences of the decimal digits 0 through 9.
(,[0-9]{3})* Suche nach 0 (null) oder mehr Vorkommen eines Gruppentrennzeichens gefolgt von drei Dezimalstellen.Look for zero or more occurrences of a group separator followed by three decimal digits.
\. Suche nach einem einzelnen Vorkommen des Dezimaltrennzeichens.Look for a single occurrence of the decimal separator.
[0-9]+ Suche nach einer oder mehr Dezimalstellen.Look for one or more decimal digits.
(\.[0-9]+)? Suche nach 0 (null) oder einem Vorkommen des Dezimaltrennzeichens, auf das mindestens eine Dezimalstelle folgt.Look for zero or one occurrence of the decimal separator followed by at least one decimal digit.

Wenn jedes dieser Teilmuster in der Eingabezeichenfolge gefunden wird, ist die Übereinstimmung erfolgreich, und dem Match-Objekt wird ein MatchCollection-Objekt hinzugefügt, das Informationen über die Übereinstimmung enthält.If each of these subpatterns is found in the input string, the match succeeds, and a Match object that contains information about the match is added to the MatchCollection object.

TitelTitle BESCHREIBUNGDescription
Sprachelemente für reguläre Ausdrücke – KurzübersichtRegular Expression Language - Quick Reference Informationen zu Zeichensatz, Operatoren und Konstrukten, mit denen Sie reguläre Ausdrücke definieren können.Provides information on the set of characters, operators, and constructs that you can use to define regular expressions.
Das Objektmodell für reguläre AusdrückeThe Regular Expression Object Model Ausführliche Informationen und Codebeispiele, die die Verwendung von Klassen für reguläre Ausdrücke veranschaulichen.Provides information and code examples that illustrate how to use the regular expression classes.
Einzelheiten zum Verhalten regulärer AusdrückeDetails of Regular Expression Behavior Ausführliche Informationen zu den Funktionen und dem Verhalten von regulären Ausdrücken in .NET.Provides information about the capabilities and behavior of .NET regular expressions.
Verwenden von regulären Ausdrücken in Visual StudioUse regular expressions in Visual Studio

VerweisReference