Konstrukce alternace
Konstrukce alternace upravuje regulární výraz pro umožnění srovnávání buď a nebo nebo podmíněného srovnávání. Rozhraní .NET Framework podporuje tři konstrukce alternace:
Porovnávání vzorků pomocí |
Podmíněné porovnávání pomocí (?(výraz)ano|ne)
Podmíněné porovnávání založené na platné zachycené skupině
Porovnávání vzorků pomocí |
Můžete použít znak svislého pruhu (|) pro porovnání kteréhokoli z řady vzorků, kde znak | odděluje každý vzorek.
Stejně jako třídu pozitivních znaků lze i znak |použít pro porovnání kteréhokoli z řady jednotlivých znaků. V následujícím příkladu je použita třída pozitivních znaků a porovnávání buď a nebo se znakem |pro nalezení výskytů slova "gray" nebo "grey" v řetězci. V tomto případě znak | vytvoří regulární výraz, který je výmluvnější.
Imports System.Text.RegularExpressions
Module Example
Public Sub Main()
' Regular expression using character class.
Dim pattern1 As String = "\bgr[ae]y\b"
' Regular expression using either/or.
Dim pattern2 As String = "\bgr(a|e)y\b"
Dim input As String = "The gray wolf blended in among the grey rocks."
For Each match As Match In Regex.Matches(input, pattern1)
Console.WriteLine("'{0}' found at position {1}", _
match.Value, match.Index)
Next
Console.WriteLine()
For Each match As Match In Regex.Matches(input, pattern2)
Console.WriteLine("'{0}' found at position {1}", _
match.Value, match.Index)
Next
End Sub
End Module
' The example displays the following output:
' 'gray' found at position 4
' 'grey' found at position 35
'
' 'gray' found at position 4
' 'grey' found at position 35
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
// Regular expression using character class.
string pattern1 = @"\bgr[ae]y\b";
// Regular expression using either/or.
string pattern2 = @"\bgr(a|e)y\b";
string input = "The gray wolf blended in among the grey rocks.";
foreach (Match match in Regex.Matches(input, pattern1))
Console.WriteLine("'{0}' found at position {1}",
match.Value, match.Index);
Console.WriteLine();
foreach (Match match in Regex.Matches(input, pattern2))
Console.WriteLine("'{0}' found at position {1}",
match.Value, match.Index);
}
}
// The example displays the following output:
// 'gray' found at position 4
// 'grey' found at position 35
//
// 'gray' found at position 4
// 'grey' found at position 35
Regulární výraz, který používá znak | ,\bgr(a|e)y\b, je interpretován tak, jak je uvedeno v následující tabulce.
Maska |
Popis |
---|---|
\b |
Začne na hranici slova. |
gr |
Porovná znaky "gr". |
(a|e) |
Porovná buď s "a" nebo s "e". |
y\b |
Porovná "y" na hranici slova. |
Složka |lze také použít pro porovnávání buď a nebo s více znaky nebo podvýrazy, které mohou obsahovat libovolnou kombinaci znakových literálů a jazykových prvků regulárních výrazů. (Třída znaků tyto funkce neposkytuje.) V následujícím příkladu je použit znak |pro extrahování buď amerického čísla sociálního zabezpečení (SSN), což je číslo složené z 9 číslic ve formátu ddd-dd-dddd nebo pro extrahování amerického identifikačního čísla zaměstnavatele (EIN), což je číslo složené z 9 číslic ve formátu dd-ddddddd.
Imports System.Text.RegularExpressions
Module Example
Public Sub Main()
Dim pattern As String = "\b(\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b"
Dim input As String = "01-9999999 020-333333 777-88-9999"
Console.WriteLine("Matches for {0}:", pattern)
For Each match As Match In Regex.Matches(input, pattern)
Console.WriteLine(" {0} at position {1}", match.Value, match.Index)
Next
End Sub
End Module
' The example displays the following output:
' Matches for \b(\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b:
' 01-9999999 at position 0
' 777-88-9999 at position 22
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = @"\b(\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b";
string input = "01-9999999 020-333333 777-88-9999";
Console.WriteLine("Matches for {0}:", pattern);
foreach (Match match in Regex.Matches(input, pattern))
Console.WriteLine(" {0} at position {1}", match.Value, match.Index);
}
}
// The example displays the following output:
// Matches for \b(\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b:
// 01-9999999 at position 0
// 777-88-9999 at position 22
Regulární výraz \b(\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b je interpretovat podle následující tabulky.
Maska |
Popis |
---|---|
\b |
Začne na hranici slova. |
(\d{2}-\d{7}|\d{3}-\d{2}-\d{4}) |
Porovná jednu z následujících možností: dvě desítkové číslice následované pomlčkou, následovanou sedmi desítkovými číslicemi; nebo tři desítkové číslice, pomlčka, dvě desítkové číslice, další pomlčka a čtyři desítkové číslice. |
\d |
Ukončí porovnání na hranici slova. |
Zpět na začátek
Podmíněné porovnávání pomocí výrazu
Tento prvek jazyka se pokusí porovnat jeden ze dvou vzorků podle toho, zda může porovnat počáteční vzorek. Jeho syntaxe je:
(?(výraz)ano|Ne)
kde výraz je počáteční vzorek pro porovnání, ano je vzorek pro porovnání, pokud je vzorek výraz porovnán a ne je volitelný vzorek pro porovnání, pokud vzorek výraz není porovnán. Modul regulárních výrazů zachází se vzorkem výraz jako s výrazem nulové šířky. To znamená, že modul regulárních výrazů nepostupuje ve vstupním proudu po vyhodnocení výrazu. Tato konstrukce je tedy ekvivalentní následujícímu:
(?(?=výraz)ano|Ne)
kde (?=výraz) je konstrukce výrazu nulové šířky. (Další informace naleznete v tématu Seskupovací konstrukce.) Protože modul regulárních výrazů interpretuje výraz jako kotvu (výraz s nulovou šířkou), výraz musí být buď nulové šířky (další informace naleznete v tématu Kotvy v regulárních výrazech) nebo podvýraz, který je také obsažen v ano. V opačném případě vzorek ano nemůže být porovnáván.
Poznámka |
---|
Pokud je výraz pojmenovaná nebo číslovaná zachytávající skupina, konstrukce alternace je interpretována jako záchytný test. Další informace naleznete v dalším oddílu Podmíněné porovnávání založené na platné zachycené skupině.Jinými slovy se modul regulárních výrazů nepokusí porovnávat zachycený podřetězec, ale místo toho testuje přítomnost nebo nepřítomnost skupiny. |
Následující příklad je pozměněný příklad, který se nachází v oddílu Porovnávání vzorků buď a nebo pomocí |. Pomocí podmíněného porovnávání určuje, zda první tři znaky na hranici slova jsou dvě číslice, které následuje pomlčka. Pokud tomu tak je, pokusí se porovnat americké identifikační číslo zaměstnavatele (EIN). Pokud tomu tak není, pokusí se porovnat americké číslo sociálního zabezpečení (SSN).
Imports System.Text.RegularExpressions
Module Example
Public Sub Main()
Dim pattern As String = "\b(?(\d{2}-)\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b"
Dim input As String = "01-9999999 020-333333 777-88-9999"
Console.WriteLine("Matches for {0}:", pattern)
For Each match As Match In Regex.Matches(input, pattern)
Console.WriteLine(" {0} at position {1}", match.Value, match.Index)
Next
End Sub
End Module
' The example displays the following output:
' Matches for \b(?(\d{2}-)\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b:
' 01-9999999 at position 0
' 777-88-9999 at position 22
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = @"\b(?(\d{2}-)\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b";
string input = "01-9999999 020-333333 777-88-9999";
Console.WriteLine("Matches for {0}:", pattern);
foreach (Match match in Regex.Matches(input, pattern))
Console.WriteLine(" {0} at position {1}", match.Value, match.Index);
}
}
// The example displays the following output:
// Matches for \b(\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b:
// 01-9999999 at position 0
// 777-88-9999 at position 22
Vzorce regulárního výrazu \b(?(\d{2}-)\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b je interpretovat podle následující tabulky.
Maska |
Popis |
---|---|
\b |
Začne na hranici slova. |
(?(\d{2}-) |
Určí zda se následující tři znaky skládají ze dvou číslic, které následuje pomlčka. |
\d{2}-\d{7} |
Pokud předchozí vzorek porovná, porovnává dvě číslice následované pomlčkou, následovanou sedmi číslicemi. |
\d{3}-\d{2}-\d{4} |
Pokud předchozí vzorek neporovná, porovnává tři desítkové číslice, pomlčku, dvě desítkové číslice, další pomlčku a čtyři desítkové číslice. |
\b |
Porovná hranici slova. |
Zpět na začátek
Podmíněné porovnávání založené na platné zachycené skupině
Tento prvek jazyka se pokusí porovnat jeden ze dvou vzorků podle toho, zda může porovnat zadanou zachycenou skupinu. Jeho syntaxe je:
(?(název)ano|Ne)
nebo
(?(číslo)ano|Ne)
kde název je název a číslo je číslo zachycené skupiny, ano je výraz pro porovnání, pokud název nebo číslo shoduje a ne je volitelný výraz pro porovnání, pokud se neshoduje.
Pokud název neodpovídá názvu záchytné skupiny, která je použita ve vzorku regulárního výrazu, konstrukce alternace je interpretována jako test výrazu, jak je vysvětleno v předchozím oddílu. Obvykle to znamená, že je výraz vyhodnocen jako false. Pokud číslo neodpovídá číslované záchytné skupině, která je použita ve vzorku regulárního výrazu, vyvolá modul regulárních výrazů ArgumentException.
Následující příklad je pozměněný příklad, který se nachází v oddílu Porovnávání vzorků buď a nebo pomocí |. Používá zachytávající skupinu s názvem n2, která se skládá ze dvou číslic, které následuje pomlčka. Konstrukce alternace testuje zda byla zachytávající skupina obsažena ve vstupním řetězci. Pokud ano, konstrukce alternace se pokusí porovnat posledních sedm číslic amerického identifikačního čísla zaměstnavatele (EIN). Pokud ne, pokusí se porovnat americké číslo sociálního zabezpečení (SSN).
Imports System.Text.RegularExpressions
Module Example
Public Sub Main()
Dim pattern As String = "\b(?<n2>\d{2}-)*(?(n2)\d{7}|\d{3}-\d{2}-\d{4})\b"
Dim input As String = "01-9999999 020-333333 777-88-9999"
Console.WriteLine("Matches for {0}:", pattern)
For Each match As Match In Regex.Matches(input, pattern)
Console.WriteLine(" {0} at position {1}", match.Value, match.Index)
Next
End Sub
End Module
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = @"\b(?<n2>\d{2}-)*(?(n2)\d{7}|\d{3}-\d{2}-\d{4})\b";
string input = "01-9999999 020-333333 777-88-9999";
Console.WriteLine("Matches for {0}:", pattern);
foreach (Match match in Regex.Matches(input, pattern))
Console.WriteLine(" {0} at position {1}", match.Value, match.Index);
}
}
// The example displays the following output:
// Matches for \b(?<n2>\d{2}-)*(?(n2)\d{7}|\d{3}-\d{2}-\d{4})\b:
// 01-9999999 at position 0
// 777-88-9999 at position 22
Vzorce regulárního výrazu \b(?<n2>\d{2}-)*(?(n2)\d{7}|\d{3}-\d{2}-\d{4})\b je interpretovat podle následující tabulky.
Maska |
Popis |
---|---|
\b |
Začne na hranici slova. |
(?<n2>\d{2}-)* |
Porovná žádný nebo jeden výskyt dvou číslic, které následuje pomlčka. Název této skupiny zachycení n2. |
(?(n2) |
Otestuje zda je n2 obsažena ve vstupním řetězci. |
)\d{7} |
Pokud je n2 obsažena, porovná sedm desítkových číslic. |
|\d{3}-\d{2}-\d{4} |
Pokud n2 není obsažena, porovná tři desítkové číslice, pomlčku, dvě desítkové číslice, další pomlčku a čtyři desítkové číslice. |
\b |
Porovná hranici slova. |
Varianta tohoto příkladu, který používá číslovanou skupinu namísto pojmenované skupiny, je znázorněna v následujícím příkladu. Vzorek regulárního výrazu je \b(\d{2}-)*(?(1)\d{7}|\d{3}-\d{2}-\d{4})\b.
Imports System.Text.RegularExpressions
Module Example
Public Sub Main()
Dim pattern As String = "\b(\d{2}-)*(?(1)\d{7}|\d{3}-\d{2}-\d{4})\b"
Dim input As String = "01-9999999 020-333333 777-88-9999"
Console.WriteLine("Matches for {0}:", pattern)
For Each match As Match In Regex.Matches(input, pattern)
Console.WriteLine(" {0} at position {1}", match.Value, match.Index)
Next
End Sub
End Module
' The example displays the following output:
' Matches for \b(\d{2}-)*(?(1)\d{7}|\d{3}-\d{2}-\d{4})\b:
' 01-9999999 at position 0
' 777-88-9999 at position 22
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = @"\b(\d{2}-)*(?(1)\d{7}|\d{3}-\d{2}-\d{4})\b";
string input = "01-9999999 020-333333 777-88-9999";
Console.WriteLine("Matches for {0}:", pattern);
foreach (Match match in Regex.Matches(input, pattern))
Console.WriteLine(" {0} at position {1}", match.Value, match.Index);
}
}
// The example display the following output:
// Matches for \b(\d{2}-)*(?(1)\d{7}|\d{3}-\d{2}-\d{4})\b:
// 01-9999999 at position 0
// 777-88-9999 at position 22
Zpět na začátek