Regulární výrazy .NET.NET Regular Expressions

Regulární výrazy poskytují výkonný, flexibilní a efektivní způsob zpracování textu.Regular expressions provide a powerful, flexible, and efficient method for processing text. Rozsáhlý zápis regulárních výrazů, který odpovídá vzoru, vám umožní rychle analyzovat velké objemy textu a najít konkrétní vzorové vzory znaků. ověření textu, aby se zajistilo, že odpovídá předdefinovanému vzoru (jako je e-mailová adresa); k extrakci, úpravám, nahrazení nebo odstranění podřetězců textu; a k přidání extrahovaných řetězců do kolekce, aby bylo možné vytvořit sestavu.The extensive pattern-matching notation of regular expressions enables you to quickly parse large amounts of text to find specific character patterns; to validate text to ensure that it matches a predefined pattern (such as an email address); to extract, edit, replace, or delete text substrings; and to add the extracted strings to a collection in order to generate a report. Pro mnoho aplikací, které pracují s řetězci nebo které analyzují velké textové bloky, jsou regulární výrazy nepostradatelným nástrojem.For many applications that deal with strings or that parse large blocks of text, regular expressions are an indispensable tool.

Principy regulárních výrazůHow Regular Expressions Work

Centerpiece zpracování textu pomocí regulárních výrazů je modul regulárních výrazů, který je reprezentován objektem System.Text.RegularExpressions.Regex v rozhraní .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. Požadované minimum pro zpracování textu pomocí regulárních výrazů je předání následujících dvou informací modulu regulárních výrazů:At a minimum, processing text using regular expressions requires that the regular expression engine be provided with the following two items of information:

  • Vzor regulárního výrazu pro identifikaci v textu.The regular expression pattern to identify in the text.

    V rozhraní .NET jsou vzory regulárních výrazů definovány speciální syntaxí nebo jazykem, který je kompatibilní s regulárními výrazy jazyka Perl 5 a přidává další funkce, jako je například shoda zprava doleva.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. Další informace najdete v tématu Jazyk regulárních výrazů – rychlé reference.For more information, see Regular Expression Language - Quick Reference.

  • Text určený k analýze pomocí vzoru regulárního výrazu.The text to parse for the regular expression pattern.

Metody třídy Regex umožňují provedení následujících operací:The methods of the Regex class let you perform the following operations:

Přehled modelu objektu regulárních výrazů naleznete v tématu model objektu regulárních výrazů.For an overview of the regular expression object model, see The Regular Expression Object Model.

Další informace o jazyce regulárních výrazů najdete v tématu Jazyk regulárních výrazů – rychlé reference nebo stažení a tisk jedné z těchto brožur:For more information about the regular expression language, see Regular Expression Language - Quick Reference or download and print one of these brochures:

Rychlá reference ve formátu aplikace Word (. docx)Quick Reference in Word (.docx) format
Rychlá reference ve formátu PDF (. PDF)Quick Reference in PDF (.pdf) format

Příklady regulárních výrazůRegular Expression Examples

Třída String zahrnuje celou řadu metod pro vyhledání nebo nahrazení řetězce, které lze ve větším řetězci použít při vyhledávání textových literálů.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ární výrazy jsou nejužitečnější při hledání jednoho nebo více dílčích podřetězců ve větším řetězci, nebo při identifikaci vzorů v řetězci, jak je znázorněno v následujícím příkladu.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.

Příklad 1: Nahrazení podřetězcůExample 1: Replacing Substrings

Předpokládejme seznam, který obsahuje jména a který může u jména a příjmení zahrnovat také oslovení (Mr., Mrs., Miss, nebo 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. Pokud při vytváření popisků ze seznamu nechcete oslovení zahrnout, můžete oslovení odstranit pomocí regulárního výrazu, jak je znázorněno v následujícím příkladu.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

Vzor regulárního výrazu (Mr\.? |Mrs\.? |Miss |Ms\.? ) odpovídá jakémukoli výskytu "Mr", "Mr", "paní", "paní", "chybíš", "MS" nebo "MS".The regular expression pattern (Mr\.? |Mrs\.? |Miss |Ms\.? ) matches any occurrence of "Mr ", "Mr. ", "Mrs ", "Mrs. ", "Miss ", "Ms or "Ms. ". Volání metody Regex.Replace nahradí vyhledaný řetězec String.Empty; jinými slovy to znamená, že jej z původního řetězce odstraní.The call to the Regex.Replace method replaces the matched string with String.Empty; in other words, it removes it from the original string.

Příklad 2: Nalezení duplicitních slovExample 2: Identifying Duplicated Words

Nechtěně zdvojená slova jsou běžnou chybou, které se autoři při psaní dopouštějí.Accidentally duplicating words is a common error that writers make. Zdvojená slova mohou být vyhledána pomocí regulárního výrazu, jak znázorňuje následující příklad.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

Vzor regulárního výrazu \b(\w+?)\s\1\b lze interpretovat následujícím způsobem:The regular expression pattern \b(\w+?)\s\1\b can be interpreted as follows:

\b Začne na hranici slova.Start at a word boundary.
(\w +?)(\w+?) Porovnává jeden nebo více znaků slova, ale co nejvíce znaků.Match one or more word characters, but as few characters as possible. Dohromady tvoří skupinu, na kterou se dá odkazovat jako na \1.Together, they form a group that can be referred to as \1.
\s Porovná prázdný znak.Match a white-space character.
\1 Porovná podřetězec, který se rovná skupině s názvem \1.Match the substring that is equal to the group named \1.
\b Porovná hranici slova.Match a word boundary.

Metoda Regex.Matches je zavolána pomocí možností regulárního výrazu, které jsou nastaveny jako RegexOptions.IgnoreCase.The Regex.Matches method is called with regular expression options set to RegexOptions.IgnoreCase. Operace shody proto rozlišuje velká a malá písmena a příklad vyhodnotí podřetězec „Tento tento“ jako zdvojené slovo.Therefore, the match operation is case-insensitive, and the example identifies the substring "This this" as a duplication.

Vstupní řetězec obsahuje podřetězec „tento?Note that the input string includes the substring "this? Tento“.This". Z důvodu výskytu otazníku však nedojde k vyhodnocení výrazu jako zdvojeného slova.However, because of the intervening punctuation mark, it is not identified as a duplication.

Příklad 3: Dynamické vytvoření regulárního výrazu zohledňujícího jazykovou verziExample 3: Dynamically Building a Culture-Sensitive Regular Expression

Následující příklad znázorňuje výkon regulárních výrazů v kombinaci s flexibilitou, kterou nabízí. Funkce globalizace netto.The following example illustrates the power of regular expressions combined with the flexibility offered by .NET's globalization features. Formát měny v aktuální jazykové verzi systému určuje objekt NumberFormatInfo.It uses the NumberFormatInfo object to determine the format of currency values in the system's current culture. Tuto informaci následně používá k vytvoření regulárního výrazu, který z textu extrahuje hodnoty měny.It then uses that information to dynamically construct a regular expression that extracts currency values from the text. Pro jednotlivé shody extrahuje podskupinu obsahující pouze číselný řetězec, převede jej na hodnotu Decimal a vypočte mezisoučet.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.

V počítači, jehož aktuální jazyková verze je English-USA (EN-US), příklad dynamicky vytvoří regulární výraz \$\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]+)?). Tento vzor regulárního výrazu může být interpretován takto:This regular expression pattern can be interpreted as follows:

\$ Vyhledá v vstupním řetězci jeden výskyt symbolu dolaru ($).Look for a single occurrence of the dollar symbol ($) in the input string. Vzor regulárního výrazu obsahuje zpětné lomítko pro označení toho, zda bude symbol dolaru spíše interpretován doslovně, než aby byl použit jako ukotvení regulárního výrazu.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. (Samotný symbol $ by označoval, že by se modul regulárních výrazů měl pokusit zahájit porovnávání na konci řetězce.) Aby se zajistilo, že symbol měny aktuální jazykové verze není špatně interpretován jako symbol regulárního výrazu, příklad volá metodu Regex.Escape pro řídicí znak.(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* Vyhledá žádný nebo několik výskytů znaku mezery.Look for zero or more occurrences of a white-space character.
[-+]? Vyhledá žádný nebo jeden ze znaků plus nebo mínus.Look for zero or one occurrence of either a positive sign or a negative sign.
([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?) Vnější závorky výrazu jej definují jako zachytávající skupinu nebo jako dílčí výraz.The outer parentheses around this expression define it as a capturing group or a subexpression. Při nalezení shody může být informace o části vyhovujícího řetězce vrácena druhým objektem Group v rámci objektu GroupCollection vráceného vlastností Match.Groups.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. (První prvek v kolekci představuje celkovou shodu.)(The first element in the collection represents the entire match.)
[0-9]{0,3} Vyhledá žádný až tři výskyty desítkových číslic od 0 do 9.Look for zero to three occurrences of the decimal digits 0 through 9.
(,[0-9]{3})* Vyhledá žádný nebo několik výskytů oddělovače skupin, za kterým následují tři desítkové číslice.Look for zero or more occurrences of a group separator followed by three decimal digits.
\. Vyhledá jeden výskyt oddělovače desetinných míst.Look for a single occurrence of the decimal separator.
[0-9]+ Vyhledá jednu nebo několik desítkových číslic.Look for one or more decimal digits.
(\.[0-9]+)? Vyhledá žádný nebo jeden výskyt oddělovače desetinných míst následovaného alespoň jednou desítkovou číslicí.Look for zero or one occurrence of the decimal separator followed by at least one decimal digit.

Pokud je v rámci vstupního řetězce každý z těchto dílčích vzorů vyhledán, dojde k nalezení shody a objekt Match, který obsahuje informaci o shodě, je přidán do objektu MatchCollection.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.

NázevTitle PopisDescription
Jazyk regulárních výrazů – stručná referenční dokumentaceRegular Expression Language - Quick Reference Poskytuje informace o sadách znaků, operátorech a konstrukcích, které lze použít pro definování regulárních výrazů.Provides information on the set of characters, operators, and constructs that you can use to define regular expressions.
Model objektu regulárního výrazuThe Regular Expression Object Model Poskytuje informace a příklady kódu znázorňující způsob používání tříd regulárních výrazů.Provides information and code examples that illustrate how to use the regular expression classes.
Podrobnosti k chování regulárních výrazůDetails of Regular Expression Behavior Poskytuje informace o schopnostech a chování regulárních výrazů .NET.Provides information about the capabilities and behavior of .NET regular expressions.
Příklady regulárních výrazůRegular Expression Examples Poskytuje příklady kódu, které znázorňují typické způsoby používání regulárních výrazů.Provides code examples that illustrate typical uses of regular expressions.

OdkazReference

System.Text.RegularExpressions
System.Text.RegularExpressions.Regex
Regulární výrazy – rychlé reference (stažení ve wordovém formátu)Regular Expressions - Quick Reference (download in Word format)
Regulární výrazy – rychlé reference (stažení ve formátu PDF)Regular Expressions - Quick Reference (download in PDF format)