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. L'operazione viene eseguita creando prima un oggetto Regex compilato, quindi utilizzando un oggetto Match per scorrere tutte le corrispondenze individuate nella stringa.

Nell'esempio il metacarattere \s corrisponde a qualsiasi spazio e \S a qualsiasi carattere.

    Sub DumpHrefs(inputString As String)
        Dim r As Regex
        Dim m As Match
    
        r = New Regex("href\s*=\s*(?:""(?<1>[^""]*)""|(?<1>\S+))", _
            RegexOptions.IgnoreCase Or RegexOptions.Compiled)
    
        m = r.Match(inputString)
        While m.Success
            Console.WriteLine("Found href " & m.Groups(1).Value _
                & " at " & m.Groups(1).Index.ToString())
            m = m.NextMatch()
        End While
    End Sub
    void DumpHrefs(String inputString) 
    {
        Regex r;
        Match m;

        r = new Regex("href\\s*=\\s*(?:\"(?<1>[^\"]*)\"|(?<1>\\S+))",
            RegexOptions.IgnoreCase|RegexOptions.Compiled);
        for (m = r.Match(inputString); m.Success; m = m.NextMatch()) 
        {
            Console.WriteLine("Found href " + m.Groups[1] + " at " 
                + m.Groups[1].Index);
        }
    }

Criterio compilato

Prima di iniziare il ciclo che effettua la ricerca all'interno della stringa, in questo esempio di codice viene creato un oggetto Regex per la memorizzazione del criterio compilato. Poiché le operazioni di analisi, ottimizzazione e compilazione di un'espressione regolare richiedono tempo, tali attività vengono svolte all'esterno del ciclo in modo che non vengano ripetute.

Le istanze della classe Regex sono immutabili. Ciascuna corrisponde a un singolo criterio ed è priva di stato. In tal modo la stessa istanza di Regex può essere condivisa da funzioni diverse o anche da thread diversi.

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