Condividi tramite


Esempio: ricerca di HREF

Aggiornamento: novembre 2007

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é l'oggetto Regex viene utilizzato nel metodo DumHRefs che può essere chiamato più volte da 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. Nell'esempio il metacarattere \s corrisponde a qualsiasi spazio e \S a qualsiasi carattere.

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

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

Classe di risultati Match

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

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, Regex supporta la sintassi (?<name>…) per l'acquisizione di una corrispondenza in uno slot specificato, che è possibile denominare tramite una stringa o un valore integer, 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

Altre risorse

Espressioni regolari di .NET Framework