Condividi tramite


Esempio: ricerca di HREF

Nell'esempio riportato di seguito viene cercata una stringa di input e vengono visualizzati tutti i valori href="…" e le relative posizioni nella stringa.

Oggetto Regex

Poiché il metodo DumpHRefs può essere chiamato più volte dal codice utente, viene utilizzato il metodo Regex.Match(String, String, RegexOptions) static (Shared in Visual Basic). In questo modo il motore delle espressioni regolari è in grado di memorizzare l'espressione regolare nella cache ed è possibile evitare il sovraccarico associato alla creazione di un'istanza di un nuovo oggetto Regex ogni volta che il metodo viene chiamato. Viene quindi utilizzato un oggetto Match per scorrere tutte le corrispondenze nella stringa.

Private Sub DumpHRefs(inputString As String) 
   Dim m As Match
   Dim HRefPattern As String = "href\s*=\s*(?:""(?<1>[^""]*)""|(?<1>\S+))"

   m = Regex.Match(inputString, HRefPattern, _ 
                   RegexOptions.IgnoreCase Or RegexOptions.Compiled)
   Do While m.Success
      Console.WriteLine("Found href {0} at {1}.", _
                        m.Groups(1), m.Groups(1).Index)
      m = m.NextMatch()
   Loop   
End Sub
private static void DumpHRefs(string inputString) 
{
   Match m;
   string HRefPattern = "href\\s*=\\s*(?:\"(?<1>[^\"]*)\"|(?<1>\\S+))";

   m = Regex.Match(inputString, HRefPattern, 
                   RegexOptions.IgnoreCase | RegexOptions.Compiled);
   while (m.Success)
   {
      Console.WriteLine("Found href " + m.Groups[1] + " at " 
         + m.Groups[1].Index);
      m = m.NextMatch();
   }   
}

Nell'esempio seguente viene illustrata una chiamata al metodo DumpHRefs.

Public Sub Main()
   Dim inputString As String = "My favorite web sites include:</P>" & _
                               "<A HREF=""https://msdn2.microsoft.com"">" & _
                               "MSDN Home Page</A></P>" & _
                               "<A HREF=""https://www.microsoft.com"">" & _
                               "Microsoft Corporation Home Page</A></P>" & _
                               "<A HREF=""https://blogs.msdn.com/bclteam"">" & _
                               ".NET Base Class Library blog</A></P>"
   DumpHRefs(inputString)                     
End Sub
' The example displays the following output:
'       Found href https://msdn2.microsoft.com at 43
'       Found href https://www.microsoft.com at 102
'       Found href https://blogs.msdn.com/bclteam/) at 176
public static void Main()
{
   string inputString = "My favorite web sites include:</P>" +
                        "<A HREF=\"https://msdn2.microsoft.com\">" +
                        "MSDN Home Page</A></P>" +
                        "<A HREF=\"https://www.microsoft.com\">" +
                        "Microsoft Corporation Home Page</A></P>" +
                        "<A HREF=\"https://blogs.msdn.com/bclteam\">" +
                        ".NET Base Class Library blog</A></P>";
   DumpHRefs(inputString);                     

}
// The example displays the following output:
//       Found href https://msdn2.microsoft.com at 43
//       Found href https://www.microsoft.com at 102
//       Found href https://blogs.msdn.com/bclteam at 176

Il modello di espressione regolare href\s*=\s*(?:"(?<1>[^""]*)"|(?<1>\S+)) viene interpretato come illustrato nella tabella seguente.

Modello

Descrizione

href

Trova la corrispondenza della stringa letterale "href". La corrispondenza prevede la distinzione tra maiuscole e minuscole.

\s*

Trovare la corrispondenza di zero o più spazi vuoti.

=

Trovare la corrispondenza del segno di uguale.

\s*

Trovare la corrispondenza di zero o più spazi vuoti.

(?:"(?<1>[^""]*)"|(?<1>\S+))

Trovare la corrispondenza di uno dei caratteri seguenti senza assegnare il risultato a un gruppo acquisito:

  • Una virgoletta, seguita da zero o più occorrenze di qualsiasi carattere diverso dalla virgoletta, seguita da una virgoletta. Il gruppo denominato 1 è incluso in questo modello.

  • Uno o più caratteri diversi da uno spazio vuoto. Il gruppo denominato 1 è incluso in questo modello.

(?<1>[^"]*)

Assegnare zero o più occorrenze di qualsiasi carattere diverso da una virgoletta al gruppo di acquisizione denominato 1.

"(?<1>\S+)

Assegnare uno o più caratteri diversi da uno spazio vuoto al gruppo di acquisizione denominato 1.

Classe di risultati Match

I risultati di una ricerca vengono archiviati nella classe Match, che consente l'accesso a tutte le sottostringhe estratte dalla ricerca. Tale classe memorizza inoltre la stringa cercata e l'espressione regolare utilizzata, al fine di poter chiamare il metodo Match.NextMatch per eseguire un'ulteriore ricerca a partire dal punto in cui è terminata l'ultima.

Catture denominate in modo esplicito

Nelle espressioni regolari tradizionali, le parentesi di cattura vengono numerate automaticamente in sequenza. Ne conseguono due problemi. Se innanzitutto un'espressione regolare viene modificata per effetto dell'inserimento o della rimozione di una coppia di parentesi, in osservanza della nuova numerazione è necessario riscrivere tutto il codice che fa riferimento alle catture numerate. In secondo luogo, poiché spesso vengono utilizzate diverse coppie di parentesi per fornire due espressioni alternative che individuano corrispondenze altrettanto valide, può risultare difficile determinare quale delle due espressioni ha effettivamente restituito un risultato.

Per risolvere questi problemi, la classe Regex supporta la sintassi (?<name>…) per l'acquisizione di una corrispondenza in uno slot specificato, che è possibile denominare tramite una stringa o un valore intero, che può essere richiamato più rapidamente. Le corrispondenze alternative della stessa stringa possono essere pertanto indirizzate tutte allo stesso comparto. In caso di conflitto, l'ultima corrispondenza inserita in un comparto è quella corretta. È comunque disponibile un elenco completo delle diverse corrispondenze relative a un singolo comparto. Per ulteriori informazioni, vedere l'insieme Group.Captures.

Vedere anche

Concetti

Espressioni regolari di .NET Framework