Condividi tramite


Costrutti di alternanza

I costrutti di alternanza modificano un'espressione regolare per abilitare la corrispondenza di tipo either/or o condizionale. .NET Framework supporta tre costrutti di alternanza:

  • Corrispondenza dei modelli con |

  • Corrispondenza condizionale con (? (espressione)sì|no)

  • Corrispondenza condizionale in base a un gruppo acquisito valido

Corrispondenza dei modelli con |

È possibile utilizzare la barra verticale (|) per indicare una qualsiasi serie di modelli, laddove il carattere | separa ogni modello.

Come la classe di caratteri positivi, il carattere | può essere utilizzato per ottenere una corrispondenza di un numero qualsiasi di caratteri singoli. L'esempio seguente utilizza sia una classe di caratteri positivi e la corrispondenza tra modelli either/or con carattere | per individuare occorrenze delle parole "grigio" o "rendere grigio" in una stringa. In questo caso, il carattere | produce un'espressione regolare più dettagliata.

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           

Espressione regolare che utilizza il carattere | , \bgr(a|e)y\b viene interpretato come illustrato nella tabella seguente.

Modello

Oggetto di descrizione

\b

Iniziare dal confine di una parola.

gr

Corrisponde ai caratteri "gr".

(a|e)

Corrisponde a una "a" o a una "e."

y\b

Corrisponde a "y" in un confine di parola.

L'attributo | può essere utilizzato anche per eseguire una corrispondenza e/o con più caratteri o sottoespressioni che possono includere qualsiasi combinazione di valori letterali carattere ed elementi del linguaggio delle espressioni regolari. (La classe di caratteri non fornisce questa funzionalità.) Nell'esempio seguente viene utilizzato il carattere | per estrarre un Numero di Previdenza sociale americano, ossia un numero di 9 cifre con formato ddd-dd-dddd o l'ID di un datore di lavoro americano che è un numero di 9 cifre in formato nn-nnnnnnn.

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

L'espressione regolare \b(\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b viene interpretata come illustrato nella tabella seguente.

Modello

Oggetto di descrizione

\b

Iniziare dal confine di una parola.

(\d{2}-\d{7}|\d{3}-\d{2}-\d{4})

Corrisponde a quanto segue: due cifre decimali seguite da un trattino seguito da sette cifre decimali; o tre cifre decimali, un trattino, due cifre decimali, un altro trattino e quattro cifre decimali.

\d

Termina la corrispondenza sul confine di parola.

Torna all'inizio

Corrispondenza condizionale con un'espressione

Questo elemento del linguaggio tenta di verificare uno di due criteri, in base alla possibilità di corrispondere a un criterio iniziale. La sintassi di questa istruzione è la seguente:

(?(espressione)sì|no)

dove espressione è il modello iniziale di corrispondenza, sì è il modello di corrispondenza se espressione corrisponde e no è il modello facoltativo di corrispondenza se espressione non corrisponde. Il motore delle espressioni regolari tratta espressione come asserzione di larghezza zero, ovvero, il motore delle espressioni regolari non avanza nel flusso di input dopo aver valutato espressione. Il costrutto equivale quindi a quanto segue:

(?(?=espressione)sì|no)

dove (?=espressione) è un costrutto di asserzione di larghezza zero. Per ulteriori informazioni, vedere Costrutti di raggruppamento. Poiché il motore delle espressioni regolari interpreta l'espressione come ancoraggio (un'asserzione a larghezza zero), l'espressione deve essere un'asserzione a larghezza zero (per ulteriori informazioni, vedere Ancoraggi in espressioni regolari) o una sottoespressione contenuta anche in sì. In caso contrario, non è possibile individuare una corrispondenza per il modello sì.

NotaNota

Se l'espressione è un gruppo di acquisizione denominato o numerato, il costrutto di alternanza viene interpretato come un test di acquisizione; per ulteriori informazioni, vedere la sezione successiva, Corrispondenza condizionale in base a un gruppo di cattura valido. In altre parole, il motore delle espressioni regolari non cerca di trovare una corrispondenza della sottostringa acquisita, ma invece verifica la presenza o l'assenza del gruppo.

L'esempio seguente è una variazione dell'esempio visualizzato nella sezione Corrispondenza dei modelli Either/Or con |. Utilizza la corrispondenza condizionale per determinare se i primi tre caratteri dopo un confine di parola sono due cifre seguite da un trattino. In caso positivo tenta di abbinare ID datore di lavoro. In caso negativo tenta di abbinare Numero di previdenza sociale.

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

Il modello di espressione regolare \b(?(\d{2}-)\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b viene interpretato come illustrato nella tabella seguente.

Modello

Oggetto di descrizione

\b

Iniziare dal confine di una parola.

(?(\d{2}-)

Determina se i tre caratteri successivi sono composti da due cifre seguite da un trattino.

\d{2}-\d{7}

Se il modello precedente corrisponde, far corrispondere due cifre seguite da un trattino seguito da sette cifre.

\d{3}-\d{2}-\d{4}

Se il modello precedente non corrisponde, far corrispondere tre cifre decimali, un trattino, due cifre decimali, un altro trattino e quattro cifre decimali.

\b

Trovare la corrispondenza di un confine di parola.

Torna all'inizio

Corrispondenza condizionale in base a un gruppo acquisito valido

Questo elemento di linguaggio tenta di corrispondere a un criterio su due, in base alla possibilità di corrispondere a un gruppo acquisito specificato. La sintassi di questa istruzione è la seguente:

(?(nome)sì|no)

oppure

(?(numero)sì|no)

dove nome è il nome e numero è il numero di un gruppo di acquisizione, sì è l'espressione di corrispondenza se nome o numero hanno una corrispondenza e no è l'espressione facoltativa se non vi è corrispondenza.

Se il nome non corrisponde al nome del gruppo di acquisizione utilizzato nel criterio di espressione regolare, il costrutto di alternanza viene interpretato come un test di acquisizione, come illustrato nella sezione precedente. In genere, questo vuole dire che l'espressione restituisce false. Se il numero non corrisponde a un gruppo di acquisizione numerato utilizzato nel criterio di espressione regolare, il motore delle espressioni regolari genera un ArgumentException.

L'esempio seguente è una variazione dell'esempio visualizzato nella sezione Corrispondenza dei modelli Either/Or con |. Utilizza un gruppo di acquisizione denominato n2, costituito da due cifre seguite da un trattino. Il costrutto di alternanza verifica se per questo gruppo di acquisizione è stata trovata una corrispondenza nella stringa di input. In caso positivo, il costrutto di alternanza tenta di abbinare le ultime sette cifre di ID datore di lavoro. In caso negativo cerca di abbinare Numero di previdenza sociale.

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

Il modello di espressione regolare \b(?<n2>\d{2}-)*(?(n2)\d{7}|\d{3}-\d{2}-\d{4})\b viene interpretato come illustrato nella tabella seguente.

Modello

Oggetto di descrizione

\b

Iniziare dal confine di una parola.

(?<n2>\d{2}-)*

Corrisponde a zero o a un'occorrenza di due cifre seguite da un trattino. Assegnare al gruppo di acquisizione il nome n2.

(?(n2)

Verificare se per n2 viene individuata una corrispondenza nella stringa di input.

)\d{7}

Se n2 corrisponde, far corrispondere sette cifre decimali.

|\d{3}-\d{2}-\d{4}

Se n2 non corrisponde, far corrispondere tre cifre decimali, un trattino, due cifre decimali, un altro trattino e quattro cifre decimali.

\b

Trovare la corrispondenza di un confine di parola.

Nell'esempio riportato di seguito viene mostrata una variazione di questo esempio che utilizza un gruppo numerato anziché un gruppo denominato. Il modello di espressione regolare è \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

Torna all'inizio

Vedere anche

Concetti

Elementi del linguaggio di espressioni regolari