Exemple : recherche de valeurs HREF
Mise à jour : novembre 2007
L'exemple suivant recherche une chaîne d'entrée et place toutes les valeurs href="..." et leurs emplacements dans la chaîne.
Objet Regex.
Étant donné que l'objet Regex est utilisé dans la méthode DumHRefs, qui peut être appelée plusieurs fois à partir du code utilisateur, la méthode Regex.Match(String, String, RegexOptions)static (Shared en Visual Basic) est utilisée. Le moteur des expressions régulières peut ainsi mettre l'expression régulière en cache, ce qui évite la surcharge liée à l'instanciation d'un nouvel objet Regex à chaque appel à la méthode. Un objet Match est ensuite utilisé 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.
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();
}
}
L'exemple suivant illustre ensuite un appel à la méthode 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 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. Consultez la collection Group.Captures pour plus de détails.)