Share via


Alternation-constructies in reguliere expressies

Alternation-constructies wijzigen een reguliere expressie om voorwaardelijke overeenkomsten in te schakelen. .NET ondersteunt drie alternation constructs:

Patroonovereenkomst met |

U kunt het verticale staafteken (|) gebruiken om een van de verschillende patronen te vinden, waarbij het | teken elk patroon scheidt.

Net als bij de positieve tekenklasse kan het | teken worden gebruikt om een van de verschillende tekens te vinden. In het volgende voorbeeld worden zowel een positieve tekenklasse als een patroon gebruikt dat overeenkomt met het | teken om exemplaren van de woorden 'grijs' of 'grijs' in een tekenreeks te vinden. In dit geval produceert het | teken een reguliere expressie die uitgebreider is.

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           

De reguliere expressie die gebruikmaakt van het | teken, \bgr(a|e)y\bwordt geïnterpreteerd zoals wordt weergegeven in de volgende tabel:

Patroon Beschrijving
\b Begin bij een woordgrens.
gr Komt overeen met de tekens 'gr'.
(a|e) Komt overeen met een 'a' of een 'e'.
y\b Komt overeen met een 'y' op een woordgrens.

Het | teken kan ook worden gebruikt om een of meer tekens of subexpressies uit te voeren, die elke combinatie van letterlijke tekens en reguliere expressietaalelementen kunnen bevatten. (De tekenklasse biedt deze functionaliteit niet.) In het volgende voorbeeld wordt het | teken gebruikt om een AMERIKAANS SSN (Social Security Number) te extraheren. Dit is een getal van 9 cijfers met de notatie ddd-d- of een U.S. Employer Identification Number (EIN), een getal van 9 cijfers met de notatie dd.-

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

De reguliere expressie \b(\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b wordt geïnterpreteerd zoals weergegeven in de volgende tabel:

Patroon Beschrijving
\b Begin bij een woordgrens.
(\d{2}-\d{7}|\d{3}-\d{2}-\d{4}) Komt overeen met een van de volgende waarden: twee decimalen gevolgd door een afbreekstreepje gevolgd door zeven decimale cijfers; of drie decimale cijfers, een afbreekstreepje, twee decimalen, een ander afbreekstreepje en vier decimale cijfers.
\b Beëindig de overeenkomst op een woordgrens.

Voorwaardelijk vergelijken met een expressie

Dit taalelement probeert een van de twee patronen te vinden, afhankelijk van of het overeenkomt met een oorspronkelijk patroon. De syntaxis is:

(?(expressie)ja)

or

(?(expressie)ja|nee)

waarbij de expressie het oorspronkelijke patroon is dat moet worden vergeleken, ja het patroon dat moet overeenkomen als de expressie overeenkomt en nee het optionele patroon is dat overeenkomt als de expressie niet overeenkomt (als er geen patroon is opgegeven, is dit gelijk aan een lege nee). De engine voor reguliere expressies behandelt expressies als een assertie met nul breedte. Dat wil zeggen dat de engine voor reguliere expressies niet verder gaat in de invoerstroom nadat de expressie is geëvalueerd. Daarom is deze constructie gelijk aan het volgende:

(?(?=expressie)ja|nee)

waarbij (?=expressie een assertieconstructie) met nul breedte is. (Zie voor meer informatie Groeperingsconstructies.) Omdat de engine voor reguliere expressies expressies interpreteert als een anker (een assertie met nul breedte), moet de expressie een assertie met nul breedte zijn (zie Ankers) of een subexpressie die ook in ja is opgenomen. Anders kan het ja-patroon niet worden vergeleken.

Notitie

Als een expressie een benoemde of genummerde opnamegroep is, wordt de alternation-constructie geïnterpreteerd als een capture-test. Zie de volgende sectie voorwaardelijk overeenkomend op basis van een geldige capturegroep voor meer informatie. Met andere woorden, de engine voor reguliere expressies probeert niet overeen te komen met de vastgelegde subtekenreeks, maar test in plaats daarvan op de aanwezigheid of afwezigheid van de groep.

Het volgende voorbeeld is een variant van het voorbeeld dat wordt weergegeven in de sectie Of patroonkoppeling met | . Er wordt gebruikgemaakt van voorwaardelijke overeenkomsten om te bepalen of de eerste drie tekens na een woordgrens twee cijfers zijn gevolgd door een afbreekstreepje. Als dat het zo is, wordt geprobeerd een Amerikaanse werkgeveridentificatienummer (EIN) te vinden. Zo niet, dan wordt geprobeerd een Amerikaans burgerservicenummer (SSN) te vinden.

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

Het reguliere expressiepatroon \b(?(\d{2}-)\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b wordt geïnterpreteerd zoals wordt weergegeven in de volgende tabel:

Patroon Beschrijving
\b Begin bij een woordgrens.
(?(\d{2}-) Bepaal of de volgende drie tekens bestaan uit twee cijfers gevolgd door een afbreekstreepje.
\d{2}-\d{7} Als het vorige patroon overeenkomt, moet u twee cijfers vergelijken, gevolgd door een afbreekstreepje gevolgd door zeven cijfers.
\d{3}-\d{2}-\d{4} Als het vorige patroon niet overeenkomt, komt u overeen met drie decimalen, een afbreekstreepje, twee decimale cijfers, een ander afbreekstreepje en vier decimale cijfers.
\b Komt overeen met een woordgrens.

Voorwaardelijke overeenkomst op basis van een geldige vastgelegde groep

Dit taalelement probeert een van de twee patronen te vinden, afhankelijk van of het overeenkomt met een opgegeven groep voor vastleggen. De syntaxis is:

(?(naam)ja)

or

(?(naam)ja|nee)

or

(?(getal)ja)

or

(?(getal)ja|nee)

waarbij de naam de naam en het getal is van een vastleggende groep, ja is de expressie die overeenkomt als de naam of het getal een overeenkomst heeft. Nee is de optionele expressie die moet overeenkomen als dat niet het geval is (als er geen patroon is opgegeven, is dit gelijk aan een leeg nee).

Als de naam niet overeenkomt met de naam van een vastleggende groep die wordt gebruikt in het reguliere expressiepatroon, wordt de alternation-constructie geïnterpreteerd als een expressietest, zoals wordt uitgelegd in de vorige sectie. Dit betekent meestal dat de expressie resulteert in false. Als getal niet overeenkomt met een genummerde vastleggende groep die wordt gebruikt in het reguliere expressiepatroon, genereert de reguliere expressie-engine een ArgumentException.

Het volgende voorbeeld is een variant van het voorbeeld dat wordt weergegeven in de sectie Of patroonkoppeling met | . Er wordt een vastleggende groep met de naam n2 gebruikt die bestaat uit twee cijfers gevolgd door een afbreekstreepje. Met de alternation construct wordt getest of deze opnamegroep overeenkomt met de invoertekenreeks. Als dat zo is, probeert de alternatieconstructie de laatste zeven cijfers van een U.S. Employer Identification Number (EIN) te vinden. Als dat niet het probleem is, wordt geprobeerd een 9-cijferig Amerikaans burgerservicenummer (SSN) te vinden.

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

Het reguliere expressiepatroon \b(?<n2>\d{2}-)?(?(n2)\d{7}|\d{3}-\d{2}-\d{4})\b wordt geïnterpreteerd zoals wordt weergegeven in de volgende tabel:

Patroon Beschrijving
\b Begin bij een woordgrens.
(?<n2>\d{2}-)? Kom overeen met nul of één exemplaar van twee cijfers, gevolgd door een afbreekstreepje. Geef deze opnamegroep n2een naam.
(?(n2) Test of n2 deze overeenkomt met de invoertekenreeks.
\d{7} Als n2 er een overeenkomst is gevonden, komt u overeen met zeven decimalen.
|\d{3}-\d{2}-\d{4} Als n2 er geen overeenkomst is gevonden, komt u overeen met drie decimalen, een afbreekstreepje, twee decimale cijfers, een ander afbreekstreepje en vier decimale cijfers.
\b Komt overeen met een woordgrens.

In het volgende voorbeeld wordt een variatie van dit voorbeeld weergegeven waarin een genummerde groep wordt gebruikt in plaats van een benoemde groep. Het reguliere expressiepatroon 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

Zie ook