Gestion des retours chariot dans chaine Regex [Résolu]

Messages postés
1
Date d'inscription
vendredi 22 novembre 2013
Dernière intervention
22 novembre 2013
- - Dernière réponse : Whismeril
Messages postés
12573
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 janvier 2019
- 25 nov. 2013 à 11:52
Bonjour,

Je souhaite extraire une valeur du code HTML d'une page à l'aide d'une Regex. Je débute avec les Regex...

Voici le partie du code HTML que je souhaite chercher:
Test</td></tr><tr id="Id-11325446" class="
toto
"
Je veux extraire l'id 11325446.

J'ai utilisé cette Regex : Regex reg = new Regex("Test</td></tr><tr id=\"Id-([0-9]*)\" class=\"toto\"", RegexOptions.IgnoreCase | RegexOptions.Compiled);

Cela ne fonctionne pas car je ne sais pas comment gérer les espaces et les retours chariot dans class...

J'ai essayé de rajouter [\s]*, [\n\r\t\v]* avant et après toto mais ça ne fonctionne pas non plus.

Est-ce que quelqu'un aurait une solution ?

Merci d'avance de votre aide
Afficher la suite 

Votre réponse

1 réponse

Messages postés
12573
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 janvier 2019
762
0
Merci
Bonsoir,

plusieurs choses:
1 il manque des espaces par-ci et par-là, et dans la partie texte exact, il faut être exact.
2 les \, doivent être échappés même s'il servent à échapper un autre caractère, donc pour " il faut écrire \\\". Ça donne ça:
            Regex maRegex = new Regex("Test</td></tr><tr id=\\\"Id-([0-9]*)\\\" class=\\\" \r\ntoto \r\n\\\"");

Maintenant ça compile, mais tu n'extrais pas ton ID. Pour ça il faut indiquer à ta regex que tu cherches une "variable". Tu vas indiquer entre parenthèses, l'association d'un nom de "variable" à son code en Regex:
(?<monID>[0-9]*)
On arrive à ça:
            Regex maRegex = new Regex("Test</td></tr><tr id=\\\"Id-(?<monID>[0-9]*)\\\" class=\\\" \r\ntoto \r\n\\\"");

Il ne reste plus qu'a récupérer ta "variable" en fait un groupe:
            string ID;
            Regex maRegex = new Regex("Test</td></tr><tr id=\\\"Id-(?<monID>[0-9]*)\\\" class=\\\" \r\ntoto \r\n\\\"");
            Match resultat = maRegex.Match(textBox1.Text);
            if (resultat.Success) ID = resultat.Groups["monID"].Value;


Il y a cette source dont je me sers souvent pour tester mes Regex, et avec laquelle j'ai débeugé la tienne.
Attention, quand tu exécutes l'application, dans la textbox d'écriture de la regex \\\" redevient \".
Bonjour,

Merci pour ta réponse.

Je sais qu'il manquait des espaces dans class, c'était ce que je n'arrivais pas à gérer dans la regex... J'avais trouvé une solution plus radicale: supprimer tous les espaces, retours à la ligne, tabulations du code HTML avant de faire la regex.

Par contre, je ne comprends pas ta 2ème remarque, ça fonctionne avec une seul \ chez moi...

Pour extraire l'id, j'avais mis simplement Groups[1] au lieu de nommer la variable mais c'est vrai que c'est plus clair d'associer un nom à la variable.

Merci pour ta solution et tes conseils.
Whismeril
Messages postés
12573
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 janvier 2019
762 -
Bonjour,

pour les \ ça dépend peut être de ton compilateur, ou alors tu as mis une @ avant le string,ou encore, tu écris la regex dasn un Textbox ou un fichier de paramètrage.....

Ensuite la notion de recherche n'apparaissait pas dans ton exemple, donc je l'ai completement écrite, et je trouve plus lisible d'y mettre un nom.

Enfin si tu as des problèmes pour prévoir les espaces il va te falloir écrire la regex de façon à accepter entre 0 et N espaces partout ou cela est imaginable, avec espace*
Commenter la réponse de Whismeril

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.