Wyrażenia regularne .NET.NET regular expressions

Wyrażenia regularne zapewniają zaawansowaną, elastyczną i wydajną metodę przetwarzania tekstu.Regular expressions provide a powerful, flexible, and efficient method for processing text. Obszerna notacja zgodna z wzorcem wyrażeń regularnych umożliwia szybkie analizowanie dużych ilości tekstu w celu:The extensive pattern-matching notation of regular expressions enables you to quickly parse large amounts of text to:

  • Znajdź określone wzorce znakowe.Find specific character patterns.
  • Sprawdź poprawność tekstu, aby upewnić się, że jest zgodny ze wstępnie zdefiniowanym wzorcem (na przykład adres e-mail).Validate text to ensure that it matches a predefined pattern (such as an email address).
  • Wyodrębnianie, edytowanie, zastępowanie lub usuwanie podciągów tekstu.Extract, edit, replace, or delete text substrings.
  • Dodaj wyodrębnione ciągi do kolekcji w celu wygenerowania raportu.Add extracted strings to a collection in order to generate a report.

W przypadku wielu aplikacji, które zajmują się ciągami lub analizują duże bloki tekstu, wyrażenia regularne są niezbędnym narzędziem.For many applications that deal with strings or that parse large blocks of text, regular expressions are an indispensable tool.

Jak działają wyrażenia regularneHow regular expressions work

Filarem przetwarzania tekstu z wyrażeniami regularnymi jest aparat wyrażeń regularnych, który jest reprezentowany przez System.Text.RegularExpressions.Regex obiekt w .NET.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. Co najmniej przetwarzanie tekstu przy użyciu wyrażeń regularnych wymaga, aby aparat wyrażeń regularnych był dostarczany z następującymi dwoma elementami informacji:At a minimum, processing text using regular expressions requires that the regular expression engine be provided with the following two items of information:

  • Wzorzec wyrażenia regularnego do identyfikacji w tekście.The regular expression pattern to identify in the text.

    W programie .NET wzorce wyrażeń regularnych są definiowane przez specjalną składnię lub język, który jest zgodny z wyrażeniami regularnymi języka Perl 5 i dodaje niektóre dodatkowe funkcje, takie jak dopasowanie z prawej strony do lewej.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. Aby uzyskać więcej informacji, zobacz Język wyrażeń regularnych — szybkie informacje.For more information, see Regular Expression Language - Quick Reference.

  • Tekst do analizy wzorca wyrażenia regularnego.The text to parse for the regular expression pattern.

Metody Regex klasy umożliwiają wykonywanie następujących operacji:The methods of the Regex class let you perform the following operations:

Aby zapoznać się z omówieniem modelu obiektów wyrażeń regularnych, zobacz model obiektów wyrażeń regularnych.For an overview of the regular expression object model, see The Regular Expression Object Model.

Aby uzyskać więcej informacji na temat języka wyrażeń regularnych, zobacz temat wyrażenie regularne — krótkie odwołanie lub pobieranie i drukowanie jednej z następujących broszur:For more information about the regular expression language, see Regular Expression Language - Quick Reference or download and print one of these brochures:

Przykłady wyrażeń regularnychRegular expression examples

StringKlasa zawiera szereg metod wyszukiwania i zamiany ciągów, których można użyć, gdy chcesz zlokalizować ciągi literału w większym ciągu.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. Wyrażenia regularne są najbardziej przydatne, gdy chcesz zlokalizować jeden z kilku podciągów w większym ciągu lub Kiedy chcesz identyfikować wzorce w ciągu, jak pokazano w poniższych przykładach.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.

Ostrzeżenie

Podczas używania System.Text.RegularExpressions do przetwarzania niezaufanych danych wejściowych należy przekazać limit czasu.When using System.Text.RegularExpressions to process untrusted input, pass a timeout. Złośliwy użytkownik może podać dane wejściowe, aby RegularExpressions spowodować atak typu "odmowa usługi".A malicious user can provide input to RegularExpressions causing a Denial-of-Service attack. Interfejsy API środowiska ASP.NET Core Framework, które używają RegularExpressions przekazywania limitu czasu.ASP.NET Core framework APIs that use RegularExpressions pass a timeout.

Porada

System.Web.RegularExpressionsPrzestrzeń nazw zawiera wiele obiektów wyrażeń regularnych, które implementują wstępnie zdefiniowane wzorce wyrażeń regularnych na potrzeby analizowania ciągów z dokumentów HTML, XML i ASP.NET.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. Na przykład TagRegex Klasa identyfikuje początkowe Tagi w ciągu, a CommentRegex Klasa identyfikuje Komentarze ASP.NET w ciągu.For example, the TagRegex class identifies start tags in a string and the CommentRegex class identifies ASP.NET comments in a string.

Przykład 1: Zastąp podciągiExample 1: Replace substrings

Załóżmy, że lista adresowa zawiera nazwy, które czasami zawierają tytuł (Mr., Pani., chybień lub MS.) wraz z imię i nazwisko.Assume that a mailing list contains names that sometimes include a title (Mr., Mrs., Miss, or Ms.) along with a first and last name. Jeśli nie chcesz uwzględniać tytułów podczas generowania etykiet kopert z listy, możesz użyć wyrażenia regularnego, aby usunąć tytuły, jak pokazano w poniższym przykładzie.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

Wzorzec wyrażenia regularnego (Mr\.? |Mrs\.? |Miss |Ms\.? ) pasuje do dowolnego wystąpienia "Mr", "Mr.", "Pani", "Pani", "chybień", "MS" lub "MS".The regular expression pattern (Mr\.? |Mrs\.? |Miss |Ms\.? ) matches any occurrence of "Mr ", "Mr. ", "Mrs ", "Mrs. ", "Miss ", "Ms or "Ms. ". Wywołanie Regex.Replace metody zastępuje dopasowany ciąg znakami String.Empty ; innymi słowy, usuwa je z oryginalnego ciągu.The call to the Regex.Replace method replaces the matched string with String.Empty; in other words, it removes it from the original string.

Przykład 2: Identyfikowanie zduplikowanych wyrazówExample 2: Identify duplicated words

Przypadkowe duplikowanie słów jest typowym błędem wprowadzanym przez autorów.Accidentally duplicating words is a common error that writers make. Wyrażenie regularne może służyć do identyfikowania zduplikowanych wyrazów, jak pokazano w poniższym przykładzie.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

Wzorzec wyrażenia regularnego \b(\w+?)\s\1\b można interpretować w następujący sposób:The regular expression pattern \b(\w+?)\s\1\b can be interpreted as follows:

WzorcePattern InterpretacjaInterpretation
\b Rozpoczyna na granicy wyrazu.Start at a word boundary.
(\w+?) Dopasowuje co najmniej jeden znak słowa, ale jak najmniejsza liczba znaków.Match one or more word characters, but as few characters as possible. Razem tworzą one grupę, która może być określana jako \1 .Together, they form a group that can be referred to as \1.
\s Dopasowuje znak odstępu.Match a white-space character.
\1 Dopasowuje podciąg, który jest równy grupie o nazwie \1 .Match the substring that is equal to the group named \1.
\b Dopasowuje granicę wyrazu.Match a word boundary.

Regex.MatchesMetoda jest wywoływana z opcjami wyrażenia regularnego ustawionym na RegexOptions.IgnoreCase .The Regex.Matches method is called with regular expression options set to RegexOptions.IgnoreCase. W związku z tym, Operacja dopasowania nie uwzględnia wielkości liter, a przykład określa podciąg "this this" jako duplikacji.Therefore, the match operation is case-insensitive, and the example identifies the substring "This this" as a duplication.

Ciąg wejściowy zawiera podciąg "this?The input string includes the substring "this? To ".This". Jednak ze względu na pozostały znak interpunkcyjny nie jest on identyfikowany jako duplikowanie.However, because of the intervening punctuation mark, it is not identified as a duplication.

Przykład 3: dynamiczne tworzenie wyrażenia regularnego z uwzględnieniem kulturyExample 3: Dynamically build a culture-sensitive regular expression

Poniższy przykład ilustruje moc wyrażeń regularnych połączonych z elastyczną oferowaną przez. Funkcje globalizacji sieci.The following example illustrates the power of regular expressions combined with the flexibility offered by .NET's globalization features. Używa NumberFormatInfo obiektu do określenia formatu wartości walutowych w bieżącej kulturze systemu.It uses the NumberFormatInfo object to determine the format of currency values in the system's current culture. Następnie używa tych informacji do dynamicznego konstruowania wyrażenia regularnego, które wyodrębnia wartości walutowe z tekstu.It then uses that information to dynamically construct a regular expression that extracts currency values from the text. Dla każdego dopasowania wyodrębnia podgrupę zawierającą tylko ciąg liczbowy, konwertuje ją na Decimal wartość i oblicza sumę uruchomienia.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.

Na komputerze, którego bieżącą kulturą jest angielski — Stany Zjednoczone (EN-US), przykład dynamicznie kompiluje wyrażenie regularne \$\s*[-+]?([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?) .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]+)?). Ten wzorzec wyrażenia regularnego można interpretować w następujący sposób:This regular expression pattern can be interpreted as follows:

WzorcePattern InterpretacjaInterpretation
\$ Poszukaj pojedynczego wystąpienia symbolu dolara ( $ ) w ciągu wejściowym.Look for a single occurrence of the dollar symbol ($) in the input string. Ciąg wzorca wyrażenia regularnego zawiera ukośnik odwrotny wskazujący, że symbol dolara ma być interpretowany dosłownie, a nie jako zakotwiczenie wyrażenia regularnego.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. ( $ Sam symbol wskazuje, że aparat wyrażeń regularnych powinien próbować rozpocząć jego dopasowanie na końcu ciągu znaków). Aby upewnić się, że symbol waluty bieżącej kultury nie jest interpretowany jako symbol wyrażenia regularnego, przykład wywołuje Regex.Escape metodę w celu ucieczki znaku.(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* Wyszukaj zero lub więcej wystąpień znaku odstępu.Look for zero or more occurrences of a white-space character.
[-+]? Poszukaj zera lub jednego wystąpienia znaku dodatniego lub znaku minus.Look for zero or one occurrence of either a positive sign or a negative sign.
([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?) Nawiasy zewnętrzne wokół tego wyrażenia definiują je jako grupę przechwytywania lub Podwyrażenie.The outer parentheses around this expression define it as a capturing group or a subexpression. W przypadku znalezienia dopasowania informacje o tej części pasującego ciągu można pobrać z drugiego Group obiektu w GroupCollection obiekcie zwracanym przez Match.Groups Właściwość.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. (Pierwszy element w kolekcji reprezentuje całe dopasowanie).(The first element in the collection represents the entire match.)
[0-9]{0,3} Wyszukaj zero do trzech wystąpień cyfr dziesiętnych od 0 do 9.Look for zero to three occurrences of the decimal digits 0 through 9.
(,[0-9]{3})* Wyszukaj zero lub więcej wystąpień separatora grupy, po których następuje trzy cyfry dziesiętne.Look for zero or more occurrences of a group separator followed by three decimal digits.
\. Poszukaj pojedynczego wystąpienia separatora dziesiętnego.Look for a single occurrence of the decimal separator.
[0-9]+ Wyszukaj co najmniej jedną cyfrę dziesiętną.Look for one or more decimal digits.
(\.[0-9]+)? Poszukaj zera lub jednego wystąpienia separatora dziesiętnego, po którym następuje co najmniej jedna cyfra dziesiętna.Look for zero or one occurrence of the decimal separator followed by at least one decimal digit.

Jeśli każdy z tych wzorców znajduje się w ciągu wejściowym, dopasowanie powiedzie się, a Match obiekt, który zawiera informacje o dopasowaniu, jest dodawany do MatchCollection obiektu.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.

TytułTitle OpisDescription
Język wyrażeń regularnych — podręczny wykazRegular Expression Language - Quick Reference Zawiera informacje dotyczące zestawu znaków, operatorów i konstrukcji, których można użyć do definiowania wyrażeń regularnych.Provides information on the set of characters, operators, and constructs that you can use to define regular expressions.
Model obiektów wyrażeń regularnychThe Regular Expression Object Model Zawiera informacje i przykłady kodu, które ilustrują sposób korzystania z klas wyrażeń regularnych.Provides information and code examples that illustrate how to use the regular expression classes.
Szczegóły zachowania dotyczącego wyrażeń regularnychDetails of Regular Expression Behavior Zawiera informacje na temat możliwości i zachowania wyrażeń regularnych programu .NET.Provides information about the capabilities and behavior of .NET regular expressions.
Używanie wyrażeń regularnych w programie Visual StudioUse regular expressions in Visual Studio

DokumentacjaReference