Konstrukcje alternacyjne w wyrażeniach regularnychAlternation Constructs in Regular Expressions

Konstrukcje zmiany modyfikują wyrażenie regularne, aby włączyć opcję / lub lub dopasowanie warunkowe.Alternation constructs modify a regular expression to enable either/or or conditional matching. .NET obsługuje trzy konstrukcje zmiany:.NET supports three alternation constructs:

Dopasowywanie wzorca z|Pattern Matching with |

Można użyć pionowy pasek (|) znaku, aby dopasować dowolny z szeregu wzorców, gdzie | rozdziela każdy wzorzec.You can use the vertical bar (|) character to match any one of a series of patterns, where the | character separates each pattern.

Klasy znaków pozytywnych, takich jak | znak może być użyty do dopasowania dowolną liczbę pojedynczych znaków.Like the positive character class, the | character can be used to match any one of a number of single characters. W poniższym przykładzie użyto klasy znaków pozytywnych i albo / lub za pomocą dopasowywania do wzorca | znaku, aby zlokalizować wystąpienia słowa "szarym" lub "szare" w ciągu.The following example uses both a positive character class and either/or pattern matching with the | character to locate occurrences of the words "gray" or "grey" in a string. W tym przypadku | znaków generuje wyrażeń regularnych, które jest pełniejszy.In this case, the | character produces a regular expression that is more verbose.

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

Wyrażenie regularne, które używa | znak \bgr(a|e)y\b, jest interpretowane tak jak pokazano w poniższej tabeli.The regular expression that uses the | character, \bgr(a|e)y\b, is interpreted as shown in the following table.

WzorzecPattern OpisDescription
\b Rozpoczyna na granicy wyrazu.Start at a word boundary.
gr Dopasowuje znaki "gr".Match the characters "gr".
(a|e) Dopasowuje znak „a” lub „e”.Match either an "a" or an "e".
y\b Dopasowuje "y" na granicy wyrazu.Match a "y" on a word boundary.

| Znaku można również przeprowadzić albo / lub zgodne z wielu znaków lub podwyrażenia, które mogą obejmować dowolną kombinację literały znakowe i elementy języka wyrażeń regularnych.The | character can also be used to perform an either/or match with multiple characters or subexpressions, which can include any combination of character literals and regular expression language elements. (Klasy znaku nie zapewnia tej funkcji). W poniższym przykładzie użyto | znaków do wyodrębnienia albo USA Numer ubezpieczenia społecznego (SSN), czyli 9 cyfr w formacie ddd-dd-dddd, lub Pracodawca Identyfikacja numeru (NIP), czyli 9 cyfr w formacie dd-ddddddd.(The character class does not provide this functionality.) The following example uses the | character to extract either a U.S. Social Security Number (SSN), which is a 9-digit number with the format ddd-dd-dddd, or a U.S. Employer Identification Number (EIN), which is a 9-digit number with the format dd-ddddddd.

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

Wyrażenie regularne \b(\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b jest interpretowane tak jak pokazano w poniższej tabeli.The regular expression \b(\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b is interpreted as shown in the following table.

WzorzecPattern OpisDescription
\b Rozpoczyna na granicy wyrazu.Start at a word boundary.
(\d{2}-\d{7}|\d{3}-\d{2}-\d{4}) Odpowiada jednej z następujących pozycji: dwie cyfry dziesiętne, następuje łącznik następuje siedmiu cyfr dziesiętnych; lub trzy cyfry dziesiętne, łącznik, dwie cyfry dziesiętne, inny łącznik i cztery cyfry dziesiętne.Match either of the following: two decimal digits followed by a hyphen followed by seven decimal digits; or three decimal digits, a hyphen, two decimal digits, another hyphen, and four decimal digits.
\d Kończy dopasowanie na granicy wyrazu.End the match at a word boundary.

Powrót do początkuBack to top

Dopasowanie warunkowe z wyrażeniemConditional Matching with an Expression

Ten element języka podejmuje próbę dopasowania, jednym z dwóch wzorców w zależności od tego, czy może dopasować wzorca początkowej.This language element attempts to match one of two patterns depending on whether it can match an initial pattern. Jego składnia jest następująca:Its syntax is:

(?( wyrażenie ) tak | nie )(?( expression ) yes | no )

gdzie wyrażenie jest początkowa wzorzec do dopasowania, tak jest wzorzec do dopasowania, jeśli wyrażenie jest dopasowywany i nie jest opcjonalna wzorzec do dopasowania, jeśli wyrażenie nie został dopasowany.where expression is the initial pattern to match, yes is the pattern to match if expression is matched, and no is the optional pattern to match if expression is not matched. Aparat wyrażeń regularnych traktuje wyrażenie jako potwierdzenie zerowej szerokości; oznacza to, że aparat wyrażeń regularnych nie awansować w strumień wejściowy po ocenia wyrażenie.The regular expression engine treats expression as a zero-width assertion; that is, the regular expression engine does not advance in the input stream after it evaluates expression. Dlatego ta konstrukcja jest odpowiednikiem następujących czynności:Therefore, this construct is equivalent to the following:

(?(?= wyrażenie ) tak | nie )(?(?= expression ) yes | no )

gdzie (?= wyrażenie ) to konstrukcja asercja o zerowej szerokości.where (?=expression) is a zero-width assertion construct. (Aby uzyskać więcej informacji, zobacz Grouping Constructs.) Ponieważ aparat wyrażeń regularnych interpretuje wyrażenie jako elementu zakotwiczenia (asercja o zerowej szerokości), wyrażenie musi być asercja o zerowej szerokości (Aby uzyskać więcej informacji, zobacz Kotwice) lub Podwyrażenie, które również znajdują się w tak.(For more information, see Grouping Constructs.) Because the regular expression engine interprets expression as an anchor (a zero-width assertion), expression must either be a zero-width assertion (for more information, see Anchors) or a subexpression that is also contained in yes. W przeciwnym razie tak nie można dopasować wzorzec.Otherwise, the yes pattern cannot be matched.

Uwaga

Jeśli wyrażeniejest nazwana lub numerowana grupa przechwytywania, konstrukcje jest interpretowana jako test przechwytywania; Aby uzyskać więcej informacji, zobacz następną sekcję warunkowego dopasowania na podstawie prawidłowej grupy przechwytywania.If expressionis a named or numbered capturing group, the alternation construct is interpreted as a capture test; for more information, see the next section, Conditional Matching Based on a Valid Capture Group. Innymi słowy aparat wyrażeń regularnych nie jest podejmowana próba Dopasuj podciąg przechwycony, ale zamiast tego sprawdza obecność lub Brak grupy.In other words, the regular expression engine does not attempt to match the captured substring, but instead tests for the presence or absence of the group.

Poniższy przykład jest odmianą przykładu, który pojawia się w albo / lub za pomocą dopasowywania do wzorca | sekcji.The following example is a variation of the example that appears in the Either/Or Pattern Matching with | section. Aby ustalić, czy pierwsze trzy znaki po granicy słowa dwie cyfry, następuje łącznik używa dopasowanie warunkowe.It uses conditional matching to determine whether the first three characters after a word boundary are two digits followed by a hyphen. Jeśli są one podejmuje próbę dopasowania Federalny Numer identyfikacji podatkowej (NIP).If they are, it attempts to match a U.S. Employer Identification Number (EIN). W przeciwnym razie podejmuje próbę dopasowania Federalny Numer ubezpieczenia społecznego (SSN).If not, it attempts to match a U.S. Social Security Number (SSN).

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

Definicję wzorca wyrażenia regularnego \b(?(\d{2}-)\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b jest interpretowane tak jak pokazano w poniższej tabeli.The regular expression pattern \b(?(\d{2}-)\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b is interpreted as shown in the following table.

WzorzecPattern OpisDescription
\b Rozpoczyna na granicy wyrazu.Start at a word boundary.
(?(\d{2}-) Ustal, czy kolejne trzy znaki składają się z dwóch cyfr następuje łącznik.Determine whether the next three characters consist of two digits followed by a hyphen.
\d{2}-\d{7} Jeśli poprzedni wzorzec jest zgodny, dopasowuje dwie cyfry, następuje łącznik następuje siedmiu cyfr.If the previous pattern matches, match two digits followed by a hyphen followed by seven digits.
\d{3}-\d{2}-\d{4} Jeśli poprzedni wzorzec nie jest zgodny, zgodne trzy cyfry dziesiętne, łącznik, dwie cyfry dziesiętne, inny łącznik i cztery cyfry dziesiętne.If the previous pattern does not match, match three decimal digits, a hyphen, two decimal digits, another hyphen, and four decimal digits.
\b Dopasowuje granicę wyrazu.Match a word boundary.

Powrót do początkuBack to top

Dopasowanie warunkowe oparte na prawidłowo przechwyconych grupachConditional Matching Based on a Valid Captured Group

Ten element języka podejmuje próbę dopasowania, jednym z dwóch wzorców w zależności od tego, czy dopasowywane określonej grupy przechwytywania.This language element attempts to match one of two patterns depending on whether it has matched a specified capturing group. Jego składnia jest następująca:Its syntax is:

(?( Nazwa ) tak | nie )(?( name ) yes | no )

lubor

(?( Liczba ) tak | nie )(?( number ) yes | no )

gdzie nazwa nazywa się i numer jest numerem grupy przechwytywania, tak jest wyrażeniem które pasują, jeśli nazwa lub numer jest zgodny, oraz nie jest opcjonalne wyrażenie dopasowania, jeśli nie ma.where name is the name and number is the number of a capturing group, yes is the expression to match if name or number has a match, and no is the optional expression to match if it does not.

Jeśli nazwa nie odpowiada na nazwę grupy przechwytywania, który jest używany we wzorcu wyrażenia regularnego, konstrukcje jest interpretowana jako test wyrażenia, zgodnie z opisem w poprzedniej sekcji.If name does not correspond to the name of a capturing group that is used in the regular expression pattern, the alternation construct is interpreted as an expression test, as explained in the previous section. Zazwyczaj oznacza to, że wyrażenie daje w wyniku false.Typically, this means that expression evaluates to false. Jeśli numer nie odpowiada numerowaną grupę przechwytywania, który jest używany we wzorcu wyrażenia regularnego zgłasza aparat wyrażeń regularnych ArgumentException.If number does not correspond to a numbered capturing group that is used in the regular expression pattern, the regular expression engine throws an ArgumentException.

Poniższy przykład jest odmianą przykładu, który pojawia się w albo / lub za pomocą dopasowywania do wzorca | sekcji.The following example is a variation of the example that appears in the Either/Or Pattern Matching with | section. Używa ona grupa przechwytywania o nazwie n2 składający się z dwóch cyfr następuje łącznik.It uses a capturing group named n2 that consists of two digits followed by a hyphen. Konstrukcja testów czy ta grupa przechwytywania został dopasowany do ciągu wejściowego.The alternation construct tests whether this capturing group has been matched in the input string. Jeśli tak, konstrukcja warunkowa próbuje dopasować ostatnich siedmiu cyfr US dziewięciu cyfr Numer identyfikacji podatkowej (NIP).If it has, the alternation construct attempts to match the last seven digits of a nine-digit U.S. Employer Identification Number (EIN). Jeśli nie ma on podejmuje próbę dopasowania USA dziewięciu cyfr Numer ubezpieczenia społecznego (SSN).If it has not, it attempts to match a nine-digit U.S. Social Security Number (SSN).

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

Definicję wzorca wyrażenia regularnego \b(?<n2>\d{2}-)?(?(n2)\d{7}|\d{3}-\d{2}-\d{4})\b jest interpretowane tak jak pokazano w poniższej tabeli.The regular expression pattern \b(?<n2>\d{2}-)?(?(n2)\d{7}|\d{3}-\d{2}-\d{4})\b is interpreted as shown in the following table.

WzorzecPattern OpisDescription
\b Rozpoczyna na granicy wyrazu.Start at a word boundary.
(?<n2>\d{2}-)? Dopasowanie zera lub jednego wystąpienia dwie cyfry, następuje łącznik.Match zero or one occurrence of two digits followed by a hyphen. Określ nazwę tej grupy przechwytywania n2.Name this capturing group n2.
(?(n2) Test czy n2 zostały dopasowane do ciągu wejściowego.Test whether n2 was matched in the input string.
)\d{7} Jeśli n2 został dopasowany, pasuje do siedmiu cyfr dziesiętnych.If n2 was matched, match seven decimal digits.
|\d{3}-\d{2}-\d{4} Jeśli n2 nie zostały dopasowane do elementu, dopasowania trzy cyfry dziesiętne, łącznik, dwie cyfry dziesiętne, inny łącznik i cztery cyfry dziesiętne.If n2 was not matched, match three decimal digits, a hyphen, two decimal digits, another hyphen, and four decimal digits.
\b Dopasowuje granicę wyrazu.Match a word boundary.

Zmiany w tym przykładzie, która używa numerowanej grupy zamiast nazwaną grupę przedstawiono w poniższym przykładzie.A variation of this example that uses a numbered group instead of a named group is shown in the following example. Jej wzorca wyrażenia regularnego jest \b(\d{2}-)?(?(1)\d{7}|\d{3}-\d{2}-\d{4})\b.Its regular expression pattern is \b(\d{2}-)?(?(1)\d{7}|\d{3}-\d{2}-\d{4})\b.

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

Zobacz takżeSee also