Exemple : recherche de valeurs HREF

L'exemple suivant recherche une chaîne d'entrée et place toutes les valeurs NavigateUrl="..." et leurs emplacements dans la chaîne. Il procède en construisant un objet Regex compilé, puis en utilisant un objet Match pour parcourir toutes les correspondances de la chaîne.

Dans cet exemple, le métacaractère \s correspond à n'importe quel caractère de type espace, et \S à n'importe quel caractère différent d'un espace.

    Sub DumpHrefs(inputString As String)
        Dim r As Regex
        Dim m As Match
    
        r = New Regex("NavigateUrl\s*=\s*(?:""(?<1>[^""]*)""|(?<1>\S+))", _
            RegexOptions.IgnoreCase Or RegexOptions.Compiled)
    
        m = r.Match(inputString)
        While m.Success
            Console.WriteLine("Found NavigateUrl " & 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("NavigateUrl\\s*=\\s*(?:\"(?<1>[^\"]*)\"|(?<1>\\S+))",
            RegexOptions.IgnoreCase|RegexOptions.Compiled);
        for (m = r.Match(inputString); m.Success; m = m.NextMatch()) 
        {
            Console.WriteLine("Found NavigateUrl " + m.Groups[1] + " at " 
                + m.Groups[1].Index);
        }
    }

Modèle compilé

Avant de lancer la boucle pour rechercher la chaîne, cet exemple de code crée un objet Regex pour stocker le modèle compilé. Comme l'analyse, l'optimisation et la compilation d'une expression régulière prennent du temps, ces tâches sont effectuées à l'extérieur de la boucle, de manière à ce qu'elles ne soient pas répétées.

Les instances de la classe Regex sont immuables ; chacune correspond à un seul modèle et est sans état. Cela permet à une même instance Regex d'être partagée par différentes fonctions, voire par différents threads.

Classe des résultats d'une mise en correspondance

Les résultats d'une recherche sont stockés dans la classe Match, qui donne accès à toutes les sous-chaînes extraites par la recherche. Cette classe garde également en mémoire la chaîne recherchée et l'expression régulière utilisée, de manière à les réutiliser pour une nouvelle recherche commençant à l'endroit où la dernière s'est terminée.

Captures nommées explicitement

Dans les expressions régulières classiques, les parenthèses sont automatiquement numérotées dans l'ordre croissant. Cela génère deux problèmes. Tout d'abord, si une expression régulière est modifiée, par exemple par insertion ou ajout d'un jeu de parenthèses, l'ensemble du code qui renvoie aux captures numérotées doit être réécrit pour prendre en compte la nouvelle numérotation. Ensuite, étant donné que différents jeux de parenthèses sont souvent utilisés pour fournir deux expressions différentes pour une correspondance acceptable, il est parfois difficile d'identifier laquelle de ces expressions a retourné un résultat.

Pour résoudre ces problèmes, Regex prend en charge la syntaxe (?<name>…) permettant de capturer une correspondance dans un emplacement spécifié (l'emplacement peut être nommé à l'aide d'une chaîne ou d'un entier, sachant que les entiers peuvent être rappelés plus rapidement). Ainsi, les différentes correspondances de la même chaîne peuvent être dirigées vers le même endroit. En cas de conflit, la dernière correspondance placée dans un emplacement est considérée étant comme la bonne. (Une liste complète des différentes correspondances existant pour un même emplacement est cependant disponible. Pour plus d'informations, consultez la collection Group.Captures.)

Voir aussi

Autres ressources

Expressions régulières du .NET Framework