Gestion des retours chariot dans chaine Regex

Résolu
lili6584 Messages postés 1 Date d'inscription vendredi 22 novembre 2013 Statut Membre Dernière intervention 22 novembre 2013 - 22 nov. 2013 à 10:59
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 - 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
A voir également:

1 réponse

Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
22 nov. 2013 à 21:26
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 \".
0
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.
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
25 nov. 2013 à 11:52
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*
0
Rejoignez-nous