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 :

Expression régulière capter des couples de chaînes


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Juin 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2004
    Messages : 21
    Par défaut Expression régulière capter des couples de chaînes
    J'ai un petit souci du quel je ne parviens pas à me sortir.
    En gros, je dois récupérer les éléments d'une chaine de connexion weblogic vers oracle avec du failover etc etc.
    Bref une grosse chaine avec plein d'options je pensais passer par les reg ex afin de capter les différentes informations.
    Par exemple récupérer le protocole etc etc.
    Après une petite analyse, j'ai à priori repéré la grammaire abstraite de ce type de chaîne :
    Tout marche avec : (ITEM)
    Un "item" contient un nom suivit d'un "=" et ensuite d'un ou plusieurs items ou d'une valeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (NOM_ITEM=VALEUR_ITEM)
    (NOM_ITEM=(NOM_ITEM1=VALEUR1)(nOM_ITEM2=VALEUR2))
    (NOM_ITEM=(NOM_ITEM3=(NOM_ITEM4=VALEUR4)))
    Je sais pas si c'est très clair, donc rien ne vaut mieux qu'un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (DESCRIPTION=(SOURCE_ROUTE=YES)(FAILOVER=TRUE)(LOAD_BALANCE=OFF)(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=monadressedns1.fr)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=monadressedns2.fr)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=serviceName)(SERVER=DEDICATED)(FAILOVER_MODE=(TYPE=SESSION))))
    Bref faut analyser ça.
    Pour isoler le premier élément, j'ai pondu la regEx :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^\\(([a-zA-Z]*)=(.*)\\)$
    En gros, ça me récupère les éléments :
    DESCRIPTION
    (SOURCE_ROUTE..........)
    Donc le nom de l'item et la valeur.
    Mais par la suite pour récupérer les éléments
    (SOURCE_ROUTE=YES)(FAILOVER=TRUE)(LOAD_BALANCE=OFF)(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=monadressedns1.fr)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=monadressedns2.fr)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=serviceName)(SERVER=DEDICATED)(FAILOVER_MODE=(TYPE=SESSION)))

    Je vois pas trop comment faire...

    Déjà je pense que ça serait intéressant de faire une expression régulière qui récupère les couples avec une expression genre :
    ^(\\([a-zA-Z]*=.*\\))*$
    Ce qui me permettrait de récupérer des couples
    SOURCE_ROUTE=YES
    FAILOVER=TRUE
    LOAD_BALANCE=OFF
    Mais ça marche pas, ça me ramène la chaîne entier. Sûrement dû au caractère ".", mais je suis obligé, car une value peut comporter n'importe quoi, comme une ip, ou même un autre item. Bref comemnt faire???
    Ça serait déjà une avancée significative. Mais dur avec les expression régulière de récupérer ça, car elles fonctionnent au maxium de match.

    Bref je suis un peu perdu

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par lordashram Voir le message
    Mais dur avec les expression régulière de récupérer ça, car elles fonctionnent au maxium de match.
    Nope, c'est juste les opérateurs que tu utilises, qu'on appelle les opérateurs "gourmands" ou "greedy."

    Pour choper le moins possible de caractères correspondants il faut utiliser des opérateurs "reluctant."

    En l'occurrence, remplacer * par *?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    A noter que des expressions régulière ne sont pas faites pour capter des systèmes imbriqués à plusieurs niveaux comme cela. Donc il faudrait peut être revoir l'idée de l'expression régulière et plutot s'orienter sur une parseur manuel simple.

  4. #4
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    en remplaçant les :
    )( par ,
    ( par {
    ) par }
    = par :
    il y aurait peut etre moyen d'exploiter un json
    http://www.json.org/java/
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  5. #5
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    j'ai tésté les remplacements dans l'ordre et j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {SOURCE_ROUTE:YES,FAILOVER:TRUE,LOAD_BALANCE:OFF,ADDRESS_LIST:{ADDRESS:{PROTOCOL:TCP,HOST:monadressedns1.fr,PORT:1521},ADDRESS:{PROTOCOL:TCP,HOST:monadressedns2.fr,PORT:1521}},CONNECT_DATA:{SERVICE_NAME:serviceName,SERVER:DEDICATED,FAILOVER_MODE:{TYPE:SESSION}}}
    ce qui me semble être un string json exploitable
    il faudra peut etre juste ajouter les quotes si le parseur de json est pointilleux


    en remplaçant
    (\{)(\w) par $1"$2.

    (\w)(:)par $1"$2.

    (:)(\w)par $1"$2.

    etc ....

    on obtient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {"SOURCE_ROUTE":"YES","FAILOVER":"TRUE","LOAD_BALANCE":"OFF","ADDRESS_LIST":{"ADDRESS":{"PROTOCOL":"TCP","HOST":"monadressedns1.fr","PORT":"1521"},"ADDRESS":{"PROTOCOL":"TCP","HOST":"monadressedns2.fr","PORT":"1521"}},"CONNECT_DATA":{"SERVICE_NAME":"serviceName","SERVER":"DEDICATED","FAILOVER_MODE":{"TYPE":"SESSION"}}}
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Juin 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2004
    Messages : 21
    Par défaut
    J'ai testé la solution de SpaceFrog
    elle fonctionne bien, l'idée est excellente.
    Mon p'tit bout de code test

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String jzurl = url.replaceAll("\\)\\(",",").replaceAll("\\(", "\\{").replaceAll("\\)","\\}");
    System.out.println("jzurl="+jzurl);
    JSONObject test = new JSONObject(jzurl);
    Avant j'ai mis la dependency dans mon pom sur json (avec Maven, sinon je pense qu'il faut prendre le jar json).

    Concernant le côté pointilleux du parseur, pas de souci chez moi, donc pas eu besoin de faire plein de remplacements en plus (de toute façon j'avais pas trop compris ce bout là ).

    Merci beaucoup à toi SpaceFrog (et les autres qui ont répondu ), plutôt que de me fourvoyer dans les regEx, le json était la bonne solution

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

Discussions similaires

  1. [RegEx] Expression régulière pour des puces numérotées
    Par The Goion dans le forum Langage
    Réponses: 1
    Dernier message: 09/07/2009, 14h08
  2. [RegEx] Expression régulière sur des caractères alphanumériques
    Par hash95 dans le forum Langage
    Réponses: 3
    Dernier message: 16/01/2008, 17h26
  3. Réponses: 9
    Dernier message: 01/06/2007, 17h58
  4. Réponses: 3
    Dernier message: 20/04/2007, 14h47
  5. Réponses: 5
    Dernier message: 30/10/2006, 13h59

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