Sdílet prostřednictvím


.NET Framework regulární výrazy

Regulární výrazy poskytují účinné, pružné a efektivní metodu pro zpracování textu. Rozsáhlé porovnávání zápis regulárních výrazů umožňuje rychle analyzovat velké množství textu vyhledat konkrétní znak vzorky; ověřit text zajistit, aby odpovídala předdefinované masce (například e-mailovou adresu); Pokud chcete extrahovat, úpravy, nahradit nebo odstranit text podřetězce; a přidat do kolekce extrahované řetězce ke generování sestavy. Pro mnoho aplikací, které se zabývají řetězce nebo že analyzovat velké bloky textu, regulární výrazy jsou nepostradatelným nástrojem.

Práce jak regulární výrazy

Dění textu, zpracování pomocí regulárních výrazů je motor regulární výraz, který je zastoupen System.Text.RegularExpressions.Regex objektu v.NET Framework. Minimálně vyžaduje zpracování textu pomocí regulárních výrazů, že motor regulárního výrazu poskytnuty následující dvě položky informací:

  • Regulární výraz vzorek identifikovat v textu.

    V.NET Framework regulárnímu výrazu vzorky jsou definovány speciální syntaxi nebo jazyk, který je kompatibilní s Perl 5, regulární výrazy a přidává některé další funkce, jako je například porovnávání zprava doleva. Další informace naleznete v tématu Prvky jazyka regulárních výrazů.

  • Text analyzovat vzorce regulárního výrazu.

Metody Regex třídy umožňují provádět následující operace:

Přehled regulárních výrazů objektový model, viz Objektový model regulárního výrazu.

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

String Třída zahrnuje počet řetězec hledání a nahrazení metody, které lze použít k vyhledání řetězce literálu ve větších řetězec. Regulární výrazy jsou užitečné, pokud chcete najít jeden několik podřetězce v řetězci větší nebo pokud chcete identifikovat vzorky v řetězci, jak ukazují následující příklady.

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

Předpokládejme, že poštovní seznam obsahuje názvy, které obsahují název (PAN, paní, paní nebo slečna) někdy spolu s jména a příjmení. Pokud chcete generovat obálky štítky ze seznamu zahrnout názvy, můžete použít regulární výraz odstranit nadpisy, jak ukazuje následující příklad.

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
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

Vzorce regulárního výrazu (Mr\.? |Mrs\.? |Miss |Ms\.? ) shodný "Pan", "Pane " , "Paní", "paní. " , "Paní", "Ms nebo"Ms. " . Volání Regex.Replace Metoda nahradí řetězec porovnané s String.Empty; jinými slovy odebere je z původní řetězec.

Příklad 2: Identifikace duplikovaná slova

Nechtěné duplikace slova je běžné chyby, aby autoři. Regulární výraz lze použít k identifikaci duplikovaná slova, jak ukazuje následující příklad.

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
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

Vzorce regulárního výrazu \b(\w+?)\s\1\b lze interpretovat takto:

\b

Začne na hranici slova.

(\w+)

Porovná jeden nebo více slovních znaků. Společně tvoří skupinu, která může být označován jako \1.

\s

Porovná prázdný znak.

\1

Odpovídající podřetězec roven skupinu s názvem \1.

\b

Porovná hranici slova.

Regex.Matches Metoda volána s regulární výraz možnosti nastaven na RegexOptions.IgnoreCase. Proto je operace rozlišovat malá a velká písmena a příklad identifikuje podřetězec "Tento to" jako duplikace.

Všimněte si, že vstupní řetězec obsahuje podřetězec "to. Toto". Avšak z důvodu požadovanými interpunkční znaménko ji není označen jako zdvojení.

Příklad 3: K dynamickému vytváření kultury citlivé regulární výraz

Následující příklad ukazuje napájení kombinované nabízí flexibilitu regulární výrazy.NET Framework funkce globalizace. Používá NumberFormatInfo objektu určují formát hodnoty měny v systému aktuální kultury. Potom používá tyto informace k dynamicky vytvářet regulární výraz, který extrahuje hodnoty měny z textu. Pro každé shodě extrahuje podskupiny, který obsahuje pouze číselný řetězec, převede jej Decimal hodnotu a vypočítá průběžný součet.

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.
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.

V počítači, jehož aktuální prostředí je Angličtina - Spojené státy (en US) příkladu vytvoří dynamicky regulárního výrazu \$\s*[-+]?([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?). Tento vzorek regulárního výrazu lze interpretovat takto:

\$

Vyhledejte jeden výskyt v vstupní řetězec symbol dolaru ($). Řetězec vzorku regulárního výrazu obsahuje lomítko označuje, že symbol dolaru je vykládat doslova spíše než jako kotvu regulárního výrazu. (Samotný symbol $ naznačují motoru regulární výraz byste pokusit zahájit odpovídající na konci řetězce.) Chcete-li zajistit, že aktuální prostředí symbol měny není chybně interpretováno, jako symbol regulárního výrazu, vyvolá Escape Metoda escape znak.

\s*

Vyhledejte nula nebo více výskytů znaku prázdného místa.

[-+]?

Vyhledejte žádný nebo jeden výskyt znaménko kladné nebo záporné znaménko.

([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?)

Vnější závorky kolem tohoto výrazu definují skupinu zachycení nebo dílčí. Pokud je nalezena shoda, informace o této části odpovídající řetězec lze načíst z druhé Group objektu v GroupCollection objekt vrácený Match.Groups vlastnost. (První prvek v kolekci představuje celý shoda.)

[0-9]{0,3}

Vyhledejte nula tři výskyty desítkové číslice 0 až 9.

(,[0-9]{3})*

Vyhledejte nula nebo více výskytů skupiny oddělovače následovaný tři desetinná místa.

\.

Vyhledejte jeden výskyt oddělovač desetinných míst.

[0-9]+

Vyhledejte jeden nebo více desetinných míst.

(\.[0-9]+)?

Vyhledejte žádný nebo jeden výskyt následované alespoň jednu číslici desetinný oddělovač desetinných míst.

Je-li každý z těchto subpatterns v vstupní řetězec nalezena shoda úspěšné a Match objekt, který obsahuje informace o shoda je přidán do MatchCollection objektu.

Příbuzná témata

Title

Popis

Prvky jazyka regulárních výrazů

Poskytuje informace o sadách znaků, operátorech a konstrukcích, které je možné použít pro definování regulárních výrazů.

Doporučené postupy pro regulární výrazy v.NET Framework

Doporučení pro optimalizaci výkonu regulární výraz a vytváření vzorců regulárních výrazů výkon, spolehlivost.

Objektový model regulárního výrazu

Poskytuje informace a příklady kódu, které znázorňují způsob použití třídy regulárních výrazů.

Podrobnosti o chování regulárních výrazů

Obsahuje informace o možnostech a chování regulárních výrazů rozhraní .NET Framework.

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

Obsahuje příklady kódu, které znázorňují typické využití regulárních výrazů.

Odkaz

System.Text.RegularExpressions

System.Text.RegularExpressions.Regex