Objektový model regulárního výrazu
Tento článek popisuje objektový model používaný při práci s regulárními výrazy .NET.
Modul regulárních výrazů
Modul regulárních výrazů v .NET je reprezentován Regex třídou. Modul regulárních výrazů zodpovídá za analýzu a kompilaci regulárního výrazu a za provádění operací, které odpovídají vzoru regulárního výrazu se vstupním řetězcem. Modul je centrální komponenta v objektovém modelu regulárního výrazu .NET.
Modul regulárních výrazů můžete použít jedním ze dvou způsobů:
Voláním statických Regex metod třídy. Parametry metody zahrnují vstupní řetězec a vzor regulárního výrazu. Modul regulárních výrazů ukládá do mezipaměti regulární výrazy používané ve volání statických metod, takže opakovaná volání statických metod regulárních výrazů, které používají stejný regulární výraz, nabízejí relativně dobrý výkon.
Vytvoření instance objektu Regex , to znamená předáním regulárního výrazu konstruktoru třídy. V tomto případě Regex je objekt neměnný (jen pro čtení) a představuje modul regulárních výrazů, který je úzce svázán s jedním regulárním výrazem. Protože regulární výrazy používané Regex instancemi nejsou uložené v mezipaměti, neměli Regex byste vytvořit instanci objektu vícekrát se stejným regulárním výrazem.
Metody třídy můžete volat Regex k provedení následujících operací:
- Určete, zda řetězec odpovídá vzoru regulárního výrazu.
- Extrahujte jednu shodu nebo první shodu.
- Extrahujte všechny shody.
- Nahraďte odpovídající podřetětěr.
- Rozdělte jeden řetězec na pole řetězců.
Tyto operace jsou popsány v následujících částech.
Porovnávání vzoru regulárního výrazu
Metoda Regex.IsMatch vrátí true
, pokud řetězec odpovídá vzoru, nebo false
pokud ne. Metoda IsMatch se často používá k ověření vstupu řetězce. Například následující kód zajistí, že řetězec odpovídá platnému číslu sociálního pojištění v USA.
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string[] values = { "111-22-3333", "111-2-3333"};
string pattern = @"^\d{3}-\d{2}-\d{4}$";
foreach (string value in values) {
if (Regex.IsMatch(value, pattern))
Console.WriteLine("{0} is a valid SSN.", value);
else
Console.WriteLine("{0}: Invalid", value);
}
}
}
// The example displays the following output:
// 111-22-3333 is a valid SSN.
// 111-2-3333: Invalid
Imports System.Text.RegularExpressions
Module Example
Public Sub Main()
Dim values() As String = {"111-22-3333", "111-2-3333"}
Dim pattern As String = "^\d{3}-\d{2}-\d{4}$"
For Each value As String In values
If Regex.IsMatch(value, pattern) Then
Console.WriteLine("{0} is a valid SSN.", value)
Else
Console.WriteLine("{0}: Invalid", value)
End If
Next
End Sub
End Module
' The example displays the following output:
' 111-22-3333 is a valid SSN.
' 111-2-3333: Invalid
Vzor ^\d{3}-\d{2}-\d{4}$
regulárního výrazu je interpretován, jak je znázorněno v následující tabulce.
Vzor | Popis |
---|---|
^ |
Porovná začátek vstupního řetězce. |
\d{3} |
Porovná tři desítkové číslice. |
- |
Porovná spojovník. |
\d{2} |
Porovná dvě desítkové číslice. |
- |
Porovná spojovník. |
\d{4} |
Porovná čtyři desítkové číslice. |
$ |
Porovná konec vstupního řetězce. |
Extrahování jedné shody nebo první shody
Metoda Regex.Match vrátí Match objekt, který obsahuje informace o prvním podřetěstru, který odpovídá vzoru regulárního výrazu. Pokud vlastnost Match.Success
vrátí true
, označující, že byla nalezena shoda, můžete načíst informace o následných shodách voláním Match.NextMatch metody. Tato volání metody mohou pokračovat, dokud Match.Success
vlastnost nevrátí false
. Například následující kód používá metodu Regex.Match(String, String) k vyhledání prvního výskytu duplikovaného slova v řetězci. Potom zavolá metodu Match.NextMatch , aby našla všechny další výskyty. Příklad prozkoumá Match.Success
vlastnost po každém volání metody, aby určil, zda aktuální shoda byla úspěšná a zda má následovat volání Match.NextMatch metody.
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string input = "This is a a farm that that raises dairy cattle.";
string pattern = @"\b(\w+)\W+(\1)\b";
Match match = Regex.Match(input, pattern);
while (match.Success)
{
Console.WriteLine("Duplicate '{0}' found at position {1}.",
match.Groups[1].Value, match.Groups[2].Index);
match = match.NextMatch();
}
}
}
// The example displays the following output:
// Duplicate 'a' found at position 10.
// Duplicate 'that' found at position 22.
Imports System.Text.RegularExpressions
Module Example
Public Sub Main()
Dim input As String = "This is a a farm that that raises dairy cattle."
Dim pattern As String = "\b(\w+)\W+(\1)\b"
Dim match As Match = Regex.Match(input, pattern)
Do While match.Success
Console.WriteLine("Duplicate '{0}' found at position {1}.", _
match.Groups(1).Value, match.Groups(2).Index)
match = match.NextMatch()
Loop
End Sub
End Module
' The example displays the following output:
' Duplicate 'a' found at position 10.
' Duplicate 'that' found at position 22.
Vzor \b(\w+)\W+(\1)\b
regulárního výrazu je interpretován, jak je znázorněno v následující tabulce.
Vzor | Popis |
---|---|
\b |
Zahajte shodu na hranici slova. |
(\w+) |
Porovná jeden nebo více znaků slova. Toto je první zachytávající skupina. |
\W+ |
Porovná jeden nebo více neslovných znaků. |
(\1) |
Porovná první zachycený řetězec. Toto je druhá zachytávající skupina. |
\b |
Ukončete shodu na hranici slova. |
Extrahování všech shod
Metoda Regex.Matches vrátí MatchCollection objekt, který obsahuje informace o všech shodách, které modul regulárních výrazů nalezen ve vstupním řetězci. Například předchozí příklad lze přepsat tak, aby volal metodu Matches místo Match metod a NextMatch metod.
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string input = "This is a a farm that that raises dairy cattle.";
string pattern = @"\b(\w+)\W+(\1)\b";
foreach (Match match in Regex.Matches(input, pattern))
Console.WriteLine("Duplicate '{0}' found at position {1}.",
match.Groups[1].Value, match.Groups[2].Index);
}
}
// The example displays the following output:
// Duplicate 'a' found at position 10.
// Duplicate 'that' found at position 22.
Imports System.Text.RegularExpressions
Module Example
Public Sub Main()
Dim input As String = "This is a a farm that that raises dairy cattle."
Dim pattern As String = "\b(\w+)\W+(\1)\b"
For Each match As Match In Regex.Matches(input, pattern)
Console.WriteLine("Duplicate '{0}' found at position {1}.", _
match.Groups(1).Value, match.Groups(2).Index)
Next
End Sub
End Module
' The example displays the following output:
' Duplicate 'a' found at position 10.
' Duplicate 'that' found at position 22.
Nahrazení odpovídajícího podřetětěce
Metoda Regex.Replace nahrazuje každý podřetězce, který odpovídá vzoru regulárního výrazu se zadaným řetězcem nebo vzorem regulárního výrazu, a vrátí celý vstupní řetězec s nahrazeními. Následující kód například přidá symbol měny USA před desetinné číslo v řetězci.
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = @"\b\d+\.\d{2}\b";
string replacement = "$$$&";
string input = "Total Cost: 103.64";
Console.WriteLine(Regex.Replace(input, pattern, replacement));
}
}
// The example displays the following output:
// Total Cost: $103.64
Imports System.Text.RegularExpressions
Module Example
Public Sub Main()
Dim pattern As String = "\b\d+\.\d{2}\b"
Dim replacement As String = "$$$&"
Dim input As String = "Total Cost: 103.64"
Console.WriteLine(Regex.Replace(input, pattern, replacement))
End Sub
End Module
' The example displays the following output:
' Total Cost: $103.64
Vzor \b\d+\.\d{2}\b
regulárního výrazu je interpretován, jak je znázorněno v následující tabulce.
Vzor | Popis |
---|---|
\b |
Začne porovnání na hranici slova. |
\d+ |
Porovná jednu nebo více desítkových číslic. |
\. |
Porovná období. |
\d{2} |
Porovná dvě desítkové číslice. |
\b |
Ukončí porovnání na hranici slova. |
Vzor nahrazení $$$&
se interpretuje, jak je znázorněno v následující tabulce.
Vzor | Náhradní řetězec |
---|---|
$$ |
Znak dolaru ($). |
$& |
Celý odpovídající podřetětěr. |
Rozdělení jednoho řetězce na pole řetězců
Metoda Regex.Split rozdělí vstupní řetězec na pozicích definovaných shodu regulárního výrazu. Například následující kód umístí položky v číslovaný seznam do pole řetězců.
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string input = "1. Eggs 2. Bread 3. Milk 4. Coffee 5. Tea";
string pattern = @"\b\d{1,2}\.\s";
foreach (string item in Regex.Split(input, pattern))
{
if (! String.IsNullOrEmpty(item))
Console.WriteLine(item);
}
}
}
// The example displays the following output:
// Eggs
// Bread
// Milk
// Coffee
// Tea
Imports System.Text.RegularExpressions
Module Example
Public Sub Main()
Dim input As String = "1. Eggs 2. Bread 3. Milk 4. Coffee 5. Tea"
Dim pattern As String = "\b\d{1,2}\.\s"
For Each item As String In Regex.Split(input, pattern)
If Not String.IsNullOrEmpty(item) Then
Console.WriteLine(item)
End If
Next
End Sub
End Module
' The example displays the following output:
' Eggs
' Bread
' Milk
' Coffee
' Tea
Vzor \b\d{1,2}\.\s
regulárního výrazu je interpretován, jak je znázorněno v následující tabulce.
Vzor | Popis |
---|---|
\b |
Začne porovnání na hranici slova. |
\d{1,2} |
Porovná jednu nebo dvě desítkové číslice. |
\. |
Porovná období. |
\s |
Porovná prázdný znak. |
Objekty MatchCollection
a Match
objekty
Metody Regex vrací dva objekty, které jsou součástí modelu objektu regulárního výrazu: MatchCollection objekt a Match objekt.
Třída MatchCollection
Metoda Regex.Matches vrátí MatchCollection objekt, který obsahuje Match objekty, které představují všechny shody, které modul regulárních výrazů našel, v pořadí, ve kterém se vyskytují ve vstupním řetězci. Pokud neexistují žádné shody, vrátí metoda MatchCollection objekt bez členů. Tato MatchCollection.Item[] vlastnost umožňuje přístup k jednotlivým členům kolekce pomocí indexu, od nuly po jednu menší než hodnota MatchCollection.Count vlastnosti. Item[] je indexer kolekce (v jazyce C#) a výchozí vlastnost (v jazyce Visual Basic).
Ve výchozím nastavení volání Regex.Matches metody používá opožděné vyhodnocení k naplnění objektu MatchCollection . Přístup k vlastnostem, které vyžadují plně naplněnou kolekci, například MatchCollection.CountMatchCollection.Item[] vlastnosti, může zahrnovat snížení výkonu. V důsledku toho doporučujeme získat přístup k kolekci pomocí objektu IEnumerator , který je vrácen metodou MatchCollection.GetEnumerator . Jednotlivé jazyky poskytují konstrukty, například For Each
v jazyce Visual Basic a foreach
v jazyce C#, které zabalí rozhraní kolekce IEnumerator .
Následující příklad používá metodu Regex.Matches(String) k naplnění MatchCollection objektu všemi shodami nalezenými ve vstupním řetězci. Příklad vytvoří výčet kolekce, zkopíruje shody do pole řetězců a zaznamenává pozice znaků v celočíselném poli.
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
MatchCollection matches;
List<string> results = new List<string>();
List<int> matchposition = new List<int>();
// Create a new Regex object and define the regular expression.
Regex r = new Regex("abc");
// Use the Matches method to find all matches in the input string.
matches = r.Matches("123abc4abcd");
// Enumerate the collection to retrieve all matches and positions.
foreach (Match match in matches)
{
// Add the match string to the string array.
results.Add(match.Value);
// Record the character position where the match was found.
matchposition.Add(match.Index);
}
// List the results.
for (int ctr = 0; ctr < results.Count; ctr++)
Console.WriteLine("'{0}' found at position {1}.",
results[ctr], matchposition[ctr]);
}
}
// The example displays the following output:
// 'abc' found at position 3.
// 'abc' found at position 7.
Imports System.Collections.Generic
Imports System.Text.RegularExpressions
Module Example
Public Sub Main()
Dim matches As MatchCollection
Dim results As New List(Of String)
Dim matchposition As New List(Of Integer)
' Create a new Regex object and define the regular expression.
Dim r As New Regex("abc")
' Use the Matches method to find all matches in the input string.
matches = r.Matches("123abc4abcd")
' Enumerate the collection to retrieve all matches and positions.
For Each match As Match In matches
' Add the match string to the string array.
results.Add(match.Value)
' Record the character position where the match was found.
matchposition.Add(match.Index)
Next
' List the results.
For ctr As Integer = 0 To results.Count - 1
Console.WriteLine("'{0}' found at position {1}.", _
results(ctr), matchposition(ctr))
Next
End Sub
End Module
' The example displays the following output:
' 'abc' found at position 3.
' 'abc' found at position 7.
Třída Match
Třída Match představuje výsledek jedné shody regulárního výrazu. K objektům můžete přistupovat Match dvěma způsoby:
Načtením z objektu MatchCollection , který je vrácen metodou Regex.Matches . Pokud chcete načíst jednotlivé Match objekty, iterujte kolekci pomocí konstruktoru
foreach
(v jazyce C#) neboFor Each
...Next
(v jazyce Visual Basic) nebo pomocí MatchCollection.Item[] vlastnosti načtěte konkrétní Match objekt buď pomocí indexu, nebo podle názvu. Jednotlivé objekty z kolekce můžete také načíst Match iterací kolekce podle indexu, od nuly do jedné menší než počet objektů v kolekci. Tato metoda však nevyužívá opožděné vyhodnocení, protože přistupuje k MatchCollection.Count vlastnosti.Následující příklad načte jednotlivé Match objekty z MatchCollection objektu iterací kolekce pomocí konstruktoru
foreach
neboFor Each
...Next
. Regulární výraz jednoduše odpovídá řetězci "abc" ve vstupním řetězci.using System; using System.Text.RegularExpressions; public class Example { public static void Main() { string pattern = "abc"; string input = "abc123abc456abc789"; foreach (Match match in Regex.Matches(input, pattern)) Console.WriteLine("{0} found at position {1}.", match.Value, match.Index); } } // The example displays the following output: // abc found at position 0. // abc found at position 6. // abc found at position 12.
Imports System.Text.RegularExpressions Module Example Public Sub Main() Dim pattern As String = "abc" Dim input As String = "abc123abc456abc789" For Each match As Match In Regex.Matches(input, pattern) Console.WriteLine("{0} found at position {1}.", _ match.Value, match.Index) Next End Sub End Module ' The example displays the following output: ' abc found at position 0. ' abc found at position 6. ' abc found at position 12.
Voláním Regex.Match metody, která vrátí Match objekt, který představuje první shodu v řetězci nebo části řetězce. Můžete určit, zda byla nalezena shoda načtením hodnoty
Match.Success
vlastnosti. Chcete-li načíst Match objekty, které představují následné shody, zavolejte Match.NextMatch metodu opakovaně, dokudSuccess
je vlastnost vráceného Match objektufalse
.Následující příklad používá Regex.Match(String, String) a Match.NextMatch metody, které odpovídají řetězci "abc" ve vstupním řetězci.
using System; using System.Text.RegularExpressions; public class Example { public static void Main() { string pattern = "abc"; string input = "abc123abc456abc789"; Match match = Regex.Match(input, pattern); while (match.Success) { Console.WriteLine("{0} found at position {1}.", match.Value, match.Index); match = match.NextMatch(); } } } // The example displays the following output: // abc found at position 0. // abc found at position 6. // abc found at position 12.
Imports System.Text.RegularExpressions Module Example Public Sub Main() Dim pattern As String = "abc" Dim input As String = "abc123abc456abc789" Dim match As Match = Regex.Match(input, pattern) Do While match.Success Console.WriteLine("{0} found at position {1}.", _ match.Value, match.Index) match = match.NextMatch() Loop End Sub End Module ' The example displays the following output: ' abc found at position 0. ' abc found at position 6. ' abc found at position 12.
Dvě vlastnosti vrácených Match objektů kolekce třídy:
Vlastnost Match.Groups vrátí GroupCollection objekt, který obsahuje informace o podřetěžcích, které odpovídají zachytávání skupin v vzoru regulárního výrazu.
Vlastnost
Match.Captures
vrátí CaptureCollection objekt, který je omezené použití. Kolekce není naplněna Match pro objekt, jehožSuccess
vlastnost jefalse
. V opačném případě obsahuje jeden Capture objekt, který má stejné informace jako Match objekt.
Další informace o těchto objektech naleznete v části GroupCollection
Třída a Třída CaptureCollection
dále v tomto článku.
Dvě další vlastnosti Match třídy poskytují informace o shodě. Vlastnost Match.Value
vrátí podřetězce ve vstupním řetězci, který odpovídá vzoru regulárního výrazu. Vlastnost Match.Index
vrátí počáteční pozici na základě nuly odpovídajícího řetězce ve vstupním řetězci.
Třída Match má také dvě metody porovnávání vzorů:
Metoda Match.NextMatch najde shodu za shodu reprezentovanou aktuálním Match objektem a vrátí Match objekt, který představuje shodu.
Metoda Match.Result provede zadanou operaci nahrazení odpovídajícího řetězce a vrátí výsledek.
Následující příklad používá metodu Match.Result k předpřipravení symbolu $ a mezery před každým číslem, které obsahuje dvě desetinné číslice.
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = @"\b\d+(,\d{3})*\.\d{2}\b";
string input = "16.32\n194.03\n1,903,672.08";
foreach (Match match in Regex.Matches(input, pattern))
Console.WriteLine(match.Result("$$ $&"));
}
}
// The example displays the following output:
// $ 16.32
// $ 194.03
// $ 1,903,672.08
Imports System.Text.RegularExpressions
Module Example
Public Sub Main()
Dim pattern As String = "\b\d+(,\d{3})*\.\d{2}\b"
Dim input As String = "16.32" + vbCrLf + "194.03" + vbCrLf + "1,903,672.08"
For Each match As Match In Regex.Matches(input, pattern)
Console.WriteLine(match.Result("$$ $&"))
Next
End Sub
End Module
' The example displays the following output:
' $ 16.32
' $ 194.03
' $ 1,903,672.08
Vzor regulárního výrazu \b\d+(,\d{3})*\.\d{2}\b
je definován, jak je znázorněno v následující tabulce.
Vzor | Popis |
---|---|
\b |
Začne porovnání na hranici slova. |
\d+ |
Porovná jednu nebo více desítkových číslic. |
(,\d{3})* |
Porovná nula nebo více výskytů čárky následované třemi desetinnými číslicemi. |
\. |
Porovná znak desetinné čárky. |
\d{2} |
Porovná dvě desítkové číslice. |
\b |
Ukončí porovnání na hranici slova. |
Vzor nahrazení $$ $&
označuje, že odpovídající podřetětěr by měl být nahrazen symbolem dolaru ( $$
$), mezerou a hodnotou shody ( $&
vzor).
Třída GroupCollection
Vlastnost Match.Groups vrátí GroupCollection objekt, který obsahuje Group objekty, které představují zachycené skupiny v jedné shodě. První Group objekt v kolekci (v indexu 0) představuje celou shodu. Každý následující objekt představuje výsledky jedné zachycené skupiny.
Jednotlivé objekty v kolekci můžete načíst Group pomocí GroupCollection.Item[] vlastnosti. Nepojmenované skupiny můžete načíst podle jejich pořadí v kolekci a načíst pojmenované skupiny podle názvu nebo podle pořadí. Nepojmenované zachycení se zobrazí jako první v kolekci a indexují se zleva doprava v pořadí, v jakém se zobrazují ve vzoru regulárního výrazu. Pojmenované zachycení se indexují po nepojmenovaných zachyceních zleva doprava v pořadí, v jakém se zobrazují ve vzoru regulárního výrazu. Chcete-li zjistit, jaké čísloované skupiny jsou k dispozici v kolekci vrácené pro konkrétní metodu porovnávání regulárních výrazů, můžete volat metodu instance Regex.GetGroupNumbers . Pokud chcete zjistit, jaké pojmenované skupiny jsou v kolekci k dispozici, můžete volat metodu instance Regex.GetGroupNames . Obě metody jsou zvláště užitečné v rutinách pro obecné účely, které analyzují shody nalezené jakýmkoli regulárním výrazem.
Vlastnost GroupCollection.Item[] je indexer kolekce v jazyce C# a výchozí vlastnost objektu kolekce v jazyce Visual Basic. To znamená, že k jednotlivým Group objektům lze přistupovat pomocí indexu (nebo podle názvu v případě pojmenovaných skupin) následujícím způsobem:
Group group = match.Groups[ctr];
Dim group As Group = match.Groups(ctr)
Následující příklad definuje regulární výraz, který používá seskupovací konstrukty k zachycení měsíce, dne a roku data.
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = @"\b(\w+)\s(\d{1,2}),\s(\d{4})\b";
string input = "Born: July 28, 1989";
Match match = Regex.Match(input, pattern);
if (match.Success)
for (int ctr = 0; ctr < match.Groups.Count; ctr++)
Console.WriteLine("Group {0}: {1}", ctr, match.Groups[ctr].Value);
}
}
// The example displays the following output:
// Group 0: July 28, 1989
// Group 1: July
// Group 2: 28
// Group 3: 1989
Imports System.Text.RegularExpressions
Module Example
Public Sub Main()
Dim pattern As String = "\b(\w+)\s(\d{1,2}),\s(\d{4})\b"
Dim input As String = "Born: July 28, 1989"
Dim match As Match = Regex.Match(input, pattern)
If match.Success Then
For ctr As Integer = 0 To match.Groups.Count - 1
Console.WriteLine("Group {0}: {1}", ctr, match.Groups(ctr).Value)
Next
End If
End Sub
End Module
' The example displays the following output:
' Group 0: July 28, 1989
' Group 1: July
' Group 2: 28
' Group 3: 1989
Vzor regulárního výrazu \b(\w+)\s(\d{1,2}),\s(\d{4})\b
je definován, jak je znázorněno v následující tabulce.
Vzor | Popis |
---|---|
\b |
Začne porovnání na hranici slova. |
(\w+) |
Porovná jeden nebo více znaků slova. Toto je první zachytávající skupina. |
\s |
Porovná prázdný znak. |
(\d{1,2}) |
Porovná jednu nebo dvě desítkové číslice. Toto je druhá zachytávající skupina. |
, |
Porovná čárku. |
\s |
Porovná prázdný znak. |
(\d{4}) |
Porovná čtyři desítkové číslice. Toto je třetí zachytávající skupina. |
\b |
Ukončete shodu na hranici slova. |
Zachycená skupina
Třída Group představuje výsledek jedné zachycené skupiny. Seskupování objektů, které představují zachytávání skupin definovaných v regulárním výrazu, jsou vráceny Item[] vlastností objektu GroupCollection vráceného Match.Groups vlastností. Vlastnost Item[] je indexer (v jazyce C#) a výchozí vlastnost (v jazyce Visual Basic) Group třídy. Jednotlivé členy můžete také načíst iterací kolekce pomocí nebo For Each
konstruktoruforeach
. Příklad najdete v předchozí části.
Následující příklad používá vnořené konstrukty seskupení k zachycení podřetězců do skupin. Vzor (a(b))c
regulárního výrazu odpovídá řetězci "abc". Přiřadí podřetěc "ab" první zachycené skupině a podřetěc "b" druhé skupině zachycení.
var matchposition = new List<int>();
var results = new List<string>();
// Define substrings abc, ab, b.
var r = new Regex("(a(b))c");
Match m = r.Match("abdabc");
for (int i = 0; m.Groups[i].Value != ""; i++)
{
// Add groups to string array.
results.Add(m.Groups[i].Value);
// Record character position.
matchposition.Add(m.Groups[i].Index);
}
// Display the capture groups.
for (int ctr = 0; ctr < results.Count; ctr++)
Console.WriteLine("{0} at position {1}",
results[ctr], matchposition[ctr]);
// The example displays the following output:
// abc at position 3
// ab at position 3
// b at position 4
Dim matchposition As New List(Of Integer)
Dim results As New List(Of String)
' Define substrings abc, ab, b.
Dim r As New Regex("(a(b))c")
Dim m As Match = r.Match("abdabc")
Dim i As Integer = 0
While Not (m.Groups(i).Value = "")
' Add groups to string array.
results.Add(m.Groups(i).Value)
' Record character position.
matchposition.Add(m.Groups(i).Index)
i += 1
End While
' Display the capture groups.
For ctr As Integer = 0 to results.Count - 1
Console.WriteLine("{0} at position {1}", _
results(ctr), matchposition(ctr))
Next
' The example displays the following output:
' abc at position 3
' ab at position 3
' b at position 4
Následující příklad používá pojmenované seskupovací konstrukty k zachycení podřetězců z řetězce, který obsahuje data ve formátu "DATANAME:VALUE", který regulární výraz rozdělí na dvojtečku (:).
var r = new Regex(@"^(?<name>\w+):(?<value>\w+)");
Match m = r.Match("Section1:119900");
Console.WriteLine(m.Groups["name"].Value);
Console.WriteLine(m.Groups["value"].Value);
// The example displays the following output:
// Section1
// 119900
Dim r As New Regex("^(?<name>\w+):(?<value>\w+)")
Dim m As Match = r.Match("Section1:119900")
Console.WriteLine(m.Groups("name").Value)
Console.WriteLine(m.Groups("value").Value)
' The example displays the following output:
' Section1
' 119900
Vzor regulárního výrazu ^(?<name>\w+):(?<value>\w+)
je definován, jak je znázorněno v následující tabulce.
Vzor | Popis |
---|---|
^ |
Zahájí porovnávání na začátku vstupního řetězce. |
(?<name>\w+) |
Porovná jeden nebo více znaků slova. Název této zachycené skupiny je name . |
: |
Porovná dvojtečku. |
(?<value>\w+) |
Porovná jeden nebo více znaků slova. Název této zachycené skupiny je value . |
Vlastnosti Group třídy poskytují informace o zachycené skupině: Vlastnost Group.Value
obsahuje zachycený podřetěc, Group.Index
vlastnost označuje počáteční pozici zachycené skupiny ve vstupním textu, Group.Length
vlastnost obsahuje délku zachyceného textu a Group.Success
vlastnost označuje, zda podřetězděc odpovídal vzoru definovanému skupinou zachycení.
Použití kvantifikátorů ve skupině (další informace viz Kvantifikátory) upraví vztah jednoho zachycení na skupinu zachycení dvěma způsoby:
Pokud se u
*
skupiny použije kvantifikátor*?
(který určuje nulovou nebo více shod), nemusí mít zachytávací skupina shodu ve vstupním řetězci. Pokud není zachycený text, vlastnosti objektu Group jsou nastaveny, jak je znázorněno v následující tabulce.Vlastnost Skupiny Hodnota Success
false
Value
String.Empty Length
0 V následujícím příkladu je uvedena ukázka. Ve vzoru
aaa(bbb)*ccc
regulárního výrazu může být první zachycená skupina (podřetěc "bbb") spárována nula nebo vícekrát. Vzhledem k tomu, že vstupní řetězec "aaaccc" odpovídá vzoru, skupina zachycení nemá shodu.using System; using System.Text.RegularExpressions; public class Example { public static void Main() { string pattern = "aaa(bbb)*ccc"; string input = "aaaccc"; Match match = Regex.Match(input, pattern); Console.WriteLine("Match value: {0}", match.Value); if (match.Groups[1].Success) Console.WriteLine("Group 1 value: {0}", match.Groups[1].Value); else Console.WriteLine("The first capturing group has no match."); } } // The example displays the following output: // Match value: aaaccc // The first capturing group has no match.
Imports System.Text.RegularExpressions Module Example Public Sub Main() Dim pattern As String = "aaa(bbb)*ccc" Dim input As String = "aaaccc" Dim match As Match = Regex.Match(input, pattern) Console.WriteLine("Match value: {0}", match.Value) If match.Groups(1).Success Then Console.WriteLine("Group 1 value: {0}", match.Groups(1).Value) Else Console.WriteLine("The first capturing group has no match.") End If End Sub End Module ' The example displays the following output: ' Match value: aaaccc ' The first capturing group has no match.
Kvantifikátory můžou odpovídat více výskytům vzoru definovaného zachytávací skupinou. V tomto případě
Value
aLength
vlastnosti objektu Group obsahují informace pouze o posledním zachycené podřetětěc. Například následující regulární výraz odpovídá jedné větě, která končí tečkou. Používá dva seskupovací konstrukce: První zachycuje jednotlivá slova spolu s prázdným znakem; druhý zachycuje jednotlivá slova. Jak ukazuje výstup z příkladu, i když regulární výraz úspěšně zachytí celou větu, druhá zachytává skupinu zachycení pouze posledního slova.using System; using System.Text.RegularExpressions; public class Example { public static void Main() { string pattern = @"\b((\w+)\s?)+\."; string input = "This is a sentence. This is another sentence."; Match match = Regex.Match(input, pattern); if (match.Success) { Console.WriteLine("Match: " + match.Value); Console.WriteLine("Group 2: " + match.Groups[2].Value); } } } // The example displays the following output: // Match: This is a sentence. // Group 2: sentence
Imports System.Text.RegularExpressions Module Example Public Sub Main() Dim pattern As String = "\b((\w+)\s?)+\." Dim input As String = "This is a sentence. This is another sentence." Dim match As Match = Regex.Match(input, pattern) If match.Success Then Console.WriteLine("Match: " + match.Value) Console.WriteLine("Group 2: " + match.Groups(2).Value) End If End Sub End Module ' The example displays the following output: ' Match: This is a sentence. ' Group 2: sentence
Třída CaptureCollection
Objekt Group obsahuje pouze informace o posledním zachycení. Celá sada zachycení provedených skupinou zachycení je však stále k dispozici z objektu CaptureCollection , který je vrácen Group.Captures vlastností. Každý člen kolekce je Capture objekt, který představuje zachycení provedené skupinou zachycení v pořadí, v jakém byly zachyceny (a proto v pořadí, v jakém byly zachycené řetězce spárovány zleva doprava ve vstupním řetězci). Jednotlivé Capture objekty z kolekce můžete načíst dvěma způsoby:
Iterací kolekce pomocí konstruktoru, jako
foreach
je (v jazyce C#) neboFor Each
(v jazyce Visual Basic).CaptureCollection.Item[] Pomocí vlastnosti načíst konkrétní objekt podle indexu. Vlastnost Item[] je výchozí vlastnost objektu CaptureCollection (v jazyce Visual Basic) nebo indexer (v jazyce C#).
Pokud se kvantifikátor nepoužije na zachytávací skupinu, CaptureCollection objekt obsahuje jeden Capture objekt, který je málo zajímavý, protože poskytuje informace o stejné shodě jako jeho Group objekt. Pokud je kvantifikátor použit u zachytávací skupiny, CaptureCollection objekt obsahuje všechny zachycení provedené skupinou zachycení a poslední člen kolekce představuje stejný zachycení jako Group objekt.
Pokud například použijete vzor ((a(b))c)+
regulárního výrazu (kde + kvantifikátor určuje jednu nebo více shod) k zachycení shod z řetězce "abcabcabc", CaptureCollection objekt pro každý Group objekt obsahuje tři členy.
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = "((a(b))c)+";
string input = "abcabcabc";
Match match = Regex.Match(input, pattern);
if (match.Success)
{
Console.WriteLine("Match: '{0}' at position {1}",
match.Value, match.Index);
GroupCollection groups = match.Groups;
for (int ctr = 0; ctr < groups.Count; ctr++) {
Console.WriteLine(" Group {0}: '{1}' at position {2}",
ctr, groups[ctr].Value, groups[ctr].Index);
CaptureCollection captures = groups[ctr].Captures;
for (int ctr2 = 0; ctr2 < captures.Count; ctr2++) {
Console.WriteLine(" Capture {0}: '{1}' at position {2}",
ctr2, captures[ctr2].Value, captures[ctr2].Index);
}
}
}
}
}
// The example displays the following output:
// Match: 'abcabcabc' at position 0
// Group 0: 'abcabcabc' at position 0
// Capture 0: 'abcabcabc' at position 0
// Group 1: 'abc' at position 6
// Capture 0: 'abc' at position 0
// Capture 1: 'abc' at position 3
// Capture 2: 'abc' at position 6
// Group 2: 'ab' at position 6
// Capture 0: 'ab' at position 0
// Capture 1: 'ab' at position 3
// Capture 2: 'ab' at position 6
// Group 3: 'b' at position 7
// Capture 0: 'b' at position 1
// Capture 1: 'b' at position 4
// Capture 2: 'b' at position 7
Imports System.Text.RegularExpressions
Module Example
Public Sub Main()
Dim pattern As String = "((a(b))c)+"
Dim input As STring = "abcabcabc"
Dim match As Match = Regex.Match(input, pattern)
If match.Success Then
Console.WriteLine("Match: '{0}' at position {1}", _
match.Value, match.Index)
Dim groups As GroupCollection = match.Groups
For ctr As Integer = 0 To groups.Count - 1
Console.WriteLine(" Group {0}: '{1}' at position {2}", _
ctr, groups(ctr).Value, groups(ctr).Index)
Dim captures As CaptureCollection = groups(ctr).Captures
For ctr2 As Integer = 0 To captures.Count - 1
Console.WriteLine(" Capture {0}: '{1}' at position {2}", _
ctr2, captures(ctr2).Value, captures(ctr2).Index)
Next
Next
End If
End Sub
End Module
' The example displays the following output:
' Match: 'abcabcabc' at position 0
' Group 0: 'abcabcabc' at position 0
' Capture 0: 'abcabcabc' at position 0
' Group 1: 'abc' at position 6
' Capture 0: 'abc' at position 0
' Capture 1: 'abc' at position 3
' Capture 2: 'abc' at position 6
' Group 2: 'ab' at position 6
' Capture 0: 'ab' at position 0
' Capture 1: 'ab' at position 3
' Capture 2: 'ab' at position 6
' Group 3: 'b' at position 7
' Capture 0: 'b' at position 1
' Capture 1: 'b' at position 4
' Capture 2: 'b' at position 7
Následující příklad používá regulární výraz (Abc)+
k vyhledání jednoho nebo více po sobě jdoucích spuštění řetězce "Abc" v řetězci "XYZAbcAbcAbcXYZAbcAb". Příklad znázorňuje použití Group.Captures vlastnosti k vrácení více skupin zachycených podřetědců.
int counter;
Match m;
CaptureCollection cc;
GroupCollection gc;
// Look for groupings of "Abc".
var r = new Regex("(Abc)+");
// Define the string to search.
m = r.Match("XYZAbcAbcAbcXYZAbcAb");
gc = m.Groups;
// Display the number of groups.
Console.WriteLine("Captured groups = " + gc.Count.ToString());
// Loop through each group.
for (int i = 0; i < gc.Count; i++)
{
cc = gc[i].Captures;
counter = cc.Count;
// Display the number of captures in this group.
Console.WriteLine("Captures count = " + counter.ToString());
// Loop through each capture in the group.
for (int ii = 0; ii < counter; ii++)
{
// Display the capture and its position.
Console.WriteLine(cc[ii] + " Starts at character " +
cc[ii].Index);
}
}
// The example displays the following output:
// Captured groups = 2
// Captures count = 1
// AbcAbcAbc Starts at character 3
// Captures count = 3
// Abc Starts at character 3
// Abc Starts at character 6
// Abc Starts at character 9
Dim counter As Integer
Dim m As Match
Dim cc As CaptureCollection
Dim gc As GroupCollection
' Look for groupings of "Abc".
Dim r As New Regex("(Abc)+")
' Define the string to search.
m = r.Match("XYZAbcAbcAbcXYZAbcAb")
gc = m.Groups
' Display the number of groups.
Console.WriteLine("Captured groups = " & gc.Count.ToString())
' Loop through each group.
Dim i, ii As Integer
For i = 0 To gc.Count - 1
cc = gc(i).Captures
counter = cc.Count
' Display the number of captures in this group.
Console.WriteLine("Captures count = " & counter.ToString())
' Loop through each capture in the group.
For ii = 0 To counter - 1
' Display the capture and its position.
Console.WriteLine(cc(ii).ToString() _
& " Starts at character " & cc(ii).Index.ToString())
Next ii
Next i
' The example displays the following output:
' Captured groups = 2
' Captures count = 1
' AbcAbcAbc Starts at character 3
' Captures count = 3
' Abc Starts at character 3
' Abc Starts at character 6
' Abc Starts at character 9
Třída Capture
Třída Capture obsahuje výsledky z jednoho dílčího výrazu zachycení. Vlastnost Capture.Value obsahuje odpovídající text a Capture.Index vlastnost označuje pozici založenou na nule ve vstupním řetězci, ve kterém začíná odpovídající podřetězc.
Následující příklad analyzuje vstupní řetězec pro teplotu vybraných měst. Čárka (",") slouží k oddělení města a jeho teploty a k oddělení dat jednotlivých měst se používá středník (;). Celý vstupní řetězec představuje jednu shodu. Ve vzoru ((\w+(\s\w+)*),(\d+);)+
regulárního výrazu, který se používá k analýze řetězce, se název města přiřadí druhé zachytávané skupině a teplota se přiřadí čtvrté skupině zachycení.
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string input = "Miami,78;Chicago,62;New York,67;San Francisco,59;Seattle,58;";
string pattern = @"((\w+(\s\w+)*),(\d+);)+";
Match match = Regex.Match(input, pattern);
if (match.Success)
{
Console.WriteLine("Current temperatures:");
for (int ctr = 0; ctr < match.Groups[2].Captures.Count; ctr++)
Console.WriteLine("{0,-20} {1,3}", match.Groups[2].Captures[ctr].Value,
match.Groups[4].Captures[ctr].Value);
}
}
}
// The example displays the following output:
// Current temperatures:
// Miami 78
// Chicago 62
// New York 67
// San Francisco 59
// Seattle 58
Imports System.Text.RegularExpressions
Module Example
Public Sub Main()
Dim input As String = "Miami,78;Chicago,62;New York,67;San Francisco,59;Seattle,58;"
Dim pattern As String = "((\w+(\s\w+)*),(\d+);)+"
Dim match As Match = Regex.Match(input, pattern)
If match.Success Then
Console.WriteLine("Current temperatures:")
For ctr As Integer = 0 To match.Groups(2).Captures.Count - 1
Console.WriteLine("{0,-20} {1,3}", match.Groups(2).Captures(ctr).Value, _
match.Groups(4).Captures(ctr).Value)
Next
End If
End Sub
End Module
' The example displays the following output:
' Current temperatures:
' Miami 78
' Chicago 62
' New York 67
' San Francisco 59
' Seattle 58
Regulární výraz je definován, jak je znázorněno v následující tabulce.
Vzor | Popis |
---|---|
\w+ |
Porovná jeden nebo více znaků slova. |
(\s\w+)* |
Porovná žádný nebo více výskytů prázdného znaku následovaného jedním nebo více znaky slova. Tento vzor odpovídá názvům měst s více slovy. Toto je třetí zachytávající skupina. |
(\w+(\s\w+)*) |
Porovná jeden nebo více znaků slova následovaných nulou nebo více výskytů prázdného znaku a jednoho nebo více znaků slova. Toto je druhá zachytávající skupina. |
, |
Porovná čárku. |
(\d+) |
Porovná jednu nebo více číslic. Toto je čtvrtá skupina zachycení. |
; |
Porovná středník. |
((\w+(\s\w+)*),(\d+);)+ |
Porovná vzor slova následovaného všemi dalšími slovy následovanými čárkami, jednou nebo více číslicemi a středníkem. Toto je první zachytávající skupina. |