J’ai fait beaucoup de regex dans ma vie avec le langage de programmation PHP, mais avec le C# je m’aventure dans de nouvelles contrées, le but est de scraper des pages web en C# (nouveau défi !) et de rester dans l’environnement .NET (SQLServer, IIS, WPF etc). Je suppose que vous avez déjà des connaissances élémentaires avec les expressions régulières.
Contenu
Expression régulière en C#
Globalement, c’est la même chose qu’en PHP, mais il y a des subtilités syntaxiques. L’objet de ce post est plutôt montrer comment écrire une application console pour tester rapidement un script qui va parser des chaine avec du regex. On ne verra sans doute pas de différence vu que ce que je présente est assez élémentaire.
Utiliser IsMatch pour matcher une séquence
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Text.RegularExpressions; namespace scraper { class Program { // http://lgmorand.developpez.com/dotnet/regex/ static void Main(string[] args) { // TODO : match, replace, capture String chaine = "numéro de téléphone est 06 55 32 22"; String telephone = "06 88 95 31 22"; Regex matchPhone = new Regex(@"^[\d]+$"); var test = matchPhone.IsMatch(telephone); Console.WriteLine("le resultat du match est " + remplace); Console.ReadLine(); } } }
Si nous faisons F5 pour lancer cette application, nous aurons comme sortie d’écran :
le resultat du match est False
En effet la chaine telephone est composé d’espace. Pour avoir le résultat à True, il faut enlever les espaces dans le numéro de téléphone (à moins de matcher aussi les espaces).
Utiliser Replace pour remplacer une chaine de caractères
using System; using System.Text.RegularExpressions; namespace scraper { class Program { // http://lgmorand.developpez.com/dotnet/regex/ static void Main(string[] args) { // TODO : match, replace, capture String chaine = "numéro de téléphone est 06 55 32 22"; String telephone = "06 88 95 31 22"; Regex myRegex = new Regex("^[a-z]$"); Regex matchPhone = new Regex(@"téléphone"); var remplace = matchPhone.Replace(chaine, "mobile"); Console.WriteLine("le remplacement regex a donné " + remplace); Console.ReadLine(); } } }
En jouant ce code vous aurez à al sortie le texte « téléphoneé remplacé par mobile.
le remplacement regex a donné : numéro de mobile est 06 55 32 22
La variable « remplace » contient la nouvelle chaine.
Capturer une chaine
Nous allons maintenant faire ce pour quoi le rege est le plus utile : extraire une chaine satisfaisant une condition et la stocker éventuellement dans une variable.
using System; using System.Text.RegularExpressions; namespace scraper { class Program { // http://lgmorand.developpez.com/dotnet/regex/ static void Main(string[] args) { // TODO : match, replace, capture String input = "numéro de téléphone est 0655322288"; Regex matchDigit = new Regex(@"[\d]+"); // match Match match = matchDigit.Match(input); if (match.Success) { string s = match.Groups[1].Value; Console.WriteLine("le match regex a donné : " + match); } else { Console.WriteLine("Pas de match trouvé"); } Console.ReadLine(); } } }
Vous avez en sortie :
le match regex a donné : 0655322288
Maintenant on sait capturer avec des parenthèses (un classique) une chaine, on va passer à l’autre volet du scraping, le téléchargement d’une page web, le tout en C# bien sûr !
PLUS : Capturer avec les groupes nommés
Il vous est possible d’attribuer u nom au groupe que vous avez capturé. C’est pratique. Voyons comment on peut réécrire l’expression régulière de tout à l’heure.
fgfg