IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Problème avec les Regex


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Découvre Netbeans et Java
    Inscrit en
    Avril 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Découvre Netbeans et Java
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Avril 2015
    Messages : 18
    Par défaut Problème avec les Regex
    Bonjour tout le monde,

    Je rencontre un petit souci dans mon code concernant les regex. Disons surtout que je ne maitrise pas encore correctement les jokers, semblet-t-il (?.*)

    Contexte: j'ai fait un http GET d'une URL et j'ai recupere sa reponse dans un string. Je veux maintenant parser ce string pour recuperer non seulement les liens mais aussi leur description.
    Exemple, le get me renvoie ceci:

    blablablabla<a href="http://www.toto.com">Site de toto</a>blablabla

    Je vais donc extraire le pattern principal, la balise complete, qui est <a href="http://www.toto.com">Site de toto</a>
    Ensuite je vais analyser ce motif et recuperer le sous-motif entre <a href=" et "> => ca c'est le lien qui est http://www.toto.com
    Enfin je vais recuperer le sous-motif entre "> et </a> => ca c'est la description qui est Site de toto

    J'ai cree les patterns
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Pattern main_balise = Pattern.compile ("<a href=\"(.*?)\"</a>"); // balise complete
    Pattern sub_balise1 = Pattern.compile ("<a href=\"(.*?)\">"); // recupere le lien
    Pattern sub_balise2 = Pattern.compile ("\">(.*?)</a>"); // recupere la description
    Matcher main_match = main_balise.matcher(body); // body est un String qui contient la reponse du serveur au http GET bien sur
    while (main_match.find()) { ...etc.}
    Or, comme ca ne fonctionne pas d'entree de jeu, je debugge petit a petit et apparemment le pattern principal ne passe pas.
    J'ai fait un test separe avec le 2e pattern pour recuper jute le lien, lui fonctionne bien, a ma grande suprise.
    Donc je ne comprends pas comment on peut recuperer l'integralite d'une balise <a href="....."> jusqu'a sa fin, c'est-a-dire </a>

    Merci d'avance a qui pourrait me depanner.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Déjà, il sera beaucoup plus simple de faire ce genre de chose avec un parser html, genre jsoup par exemple (qui permet même de faire directement la requête, accompagné de cssselector, pour faire rapidement la sélection des balises a avec un sélecteur css), ou htmlunit, si le html est dynamique (généré/modifié par du JavaScript).

    En ce qui concerne l'expression régulière, le problème vient du sous-motif .* qui veut dire n'importe quelle suite de n'importe quel caractère, donc y compris le " qui finalise le lien. Cherche toute suite de caractères sauf le " : [^"]*. Inutile, par ailleurs, de faire plusieurs expressions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Pattern main_balise = Pattern.compile ("<a href=\"([^\"]*)\">([^>]*)</a>"); 
    Matcher main_match = main_balise.matcher(body); // body est un String qui contient la reponse du serveur au http GET bien sur
    while (main_match.find()) {
    			System.out.println(main_match.group(1)); // affiche le lien
    			System.out.println(main_match.group(2)); // affiche le contenu
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par joel.drigo Voir le message
    En ce qui concerne l'expression régulière, le problème vient du sous-motif .* qui veut dire n'importe quelle suite de n'importe quel caractère, donc y compris le " qui finalise le lien.
    Sauf qu'il utilise .*?, qui est un quantifieur réticent, c'est à dire qu'il prendra le plus petit élément correspondant.

    Le problème c'est surtout qu'il manque la fermeture de balise dans son expression : "<a href=\"(.*?)\"</a>"Ce devrait plutôt être : "<a href=\"(.*?)\">(.*?)</a>"
    Citation Envoyé par joel.drigo Voir le message
    Déjà, il sera beaucoup plus simple de faire ce genre de chose avec un parser html, genre jsoup par exemple (qui permet même de faire directement la requête, accompagné de cssselector, pour faire rapidement la sélection des balises a avec un sélecteur css), ou htmlunit, si le html est dynamique (généré/modifié par du JavaScript).
    Gros +1

    JSoup est vraiment très pratique.


    a++

  4. #4
    Membre averti
    Homme Profil pro
    Découvre Netbeans et Java
    Inscrit en
    Avril 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Découvre Netbeans et Java
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Avril 2015
    Messages : 18
    Par défaut
    Merci beaucoup. Je ne connaissais pas du tout Jsoup (et absolument rien en CSS). Apres, c'etait ici plus un exercice perso pour apprendre un peu a maitriser les methodes de String sous Java. J'imagine bien que pour ce genre de truc simple, on trouve des API a foison.

    Edit: question subsidiaire. Je pensej que le match.find est case sensitive non? Supposons que dans le body on ait un farceur qui mette par exemple:
    <a href="...">description</A>

    La balise de fin est en majuscule, je me fais avoir

    Edit 2: c'est bon j'ai trouve. Il suffit de rajouter le case insensitive (?i) devant le pattern.

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Il y a des milliers de chaines valide au sens HTML, mais qui ne passerait pas ta regexp.
    Quelques exemples :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     <a href='...'>description</a>
     <a  href="...">description</a>
     <a href="..." >description</a>
     <a class="link" href="...">description</a>
     <a href="..." class="link">description</a>

    D'où l'intérêt d'utiliser un outil comme JSoup qui va parser correctement le code HTML...


    a++

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Clocloc Voir le message
    Edit 2: c'est bon j'ai trouve. Il suffit de rajouter le case insensitive (?i) devant le pattern.
    Ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pattern.compile ( expression , Pattern.CASE_INSENSITIVE);
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec les regex
    Par atchopba dans le forum Langage
    Réponses: 4
    Dernier message: 29/07/2013, 09h28
  2. Problème avec les regex
    Par fred33 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 05/10/2012, 12h07
  3. problème avec les regex
    Par regisyves dans le forum ASP
    Réponses: 0
    Dernier message: 31/03/2010, 23h20
  4. REGEX problème avec les "
    Par storm_2000 dans le forum Collection et Stream
    Réponses: 9
    Dernier message: 30/11/2006, 18h32
  5. [RegEx] Problème avec les regex
    Par dragon noir dans le forum Langage
    Réponses: 3
    Dernier message: 24/07/2006, 11h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo