.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:
Zjistěte, zda vzorce regulárního výrazu dochází ve vstupním textu voláním IsMatch metody. Příklad, který používá IsMatch metodu ověření textu, viz Postupy: Ověření, zda jsou řetězce v platném formát pro e-mail.
Načíst jeden nebo všechny výskyty textu odpovídající vzorce regulárního výrazu voláním Match nebo Matches metody. Bývalý metoda vrátí Match objekt, který poskytuje informace o odpovídající text. Posledně vrátí MatchCollection obsahuje jeden objekt Match objekt všech nalezených v analyzované text.
Nahradit text, který odpovídá vzorce regulárního výrazu voláním Replace metody. Příklady, které používají Replace Metoda změnit formáty data a odebrání neplatných znaků z řetězce, viz Postupy: Odstranění neplatných znaků z řetězce a Příklad: Změna formátů dat.
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 |
---|---|
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í pro optimalizaci výkonu regulární výraz a vytváření vzorců regulárních výrazů výkon, spolehlivost. |
|
Poskytuje informace a příklady kódu, které znázorňují způsob použití třídy regulárních výrazů. |
|
Obsahuje informace o možnostech a chování regulárních výrazů rozhraní .NET Framework. |
|
Obsahuje příklady kódu, které znázorňují typické využití regulárních výrazů. |