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

Java Discussion :

Expression régulière pour des équations de chimie


Sujet :

Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 475
    Points : 587
    Points
    587
    Par défaut Expression régulière pour des équations de chimie
    Bonjour à tous,

    Je suis une bille en expression régulière, et pour une appli, j'ai besoin d'une qui matche une équation de chimie particulière.
    J'en ai trouvé une issue du JS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     /^([A-Za-z][a-z]*|[0-9]+|[+\\-^=()])$/
    qui permet de très bien vérifier les équations du genre :
    "H2 + O2 = H2O",
    "AgNO3 + BaCl2 = Ba(NO3)2 + AgCl",
    "H2O2 + Cr2O7^2- = Cr^3+ + O2 + OH^-".

    Mais je souhaiterais l'améliorer pour qu'elle interprète ce type d'équation :
    "Ba(OH)₂·8H₂O + HNO₃ → Ba(NO₃)₂ + H₂O (avec le .nH2O)",
    "FeC2O4⋅2H2O + H2C2O4 + H2O2 + K2C2O4 -> K3(Fe(C2O4)3)⋅3H2O"
    J'ai essayé ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ([A-Za-z][a-z]*|[0-9]+[\\.][0-9]+[H2O]|[+\-^=()])
    mais ca n'a pas l'air d'être bon. Où est mon erreur ? Auriez vous la solution ?
    Merci

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Citation Envoyé par Turvy Voir le message
    J'en ai trouvé une issue du JS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /^([A-Za-z][a-z]*|[0-9]+|[+\\-^=()])$/
    qui permet de très bien vérifier les équations du genre :
    "H2 + O2 = H2O",
    "AgNO3 + BaCl2 = Ba(NO3)2 + AgCl",
    "H2O2 + Cr2O7^2- = Cr^3+ + O2 + OH^-"
    Cette pattern ne vérifie rien du tout (que ce soit en JS ou en Java), d'ailleurs elle ne matche même pas les équations que tu présentes.

    Il faudrait commencer par expliquer concrètement ce que tu entends par vérifier une équation.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 475
    Points : 587
    Points
    587
    Par défaut
    Bonjour Cosmo,

    Effectivement, c'est pas très clair. Voici le bout de code exécuté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            Pattern pattern = Pattern.compile("([A-Za-z][a-z]*|[0-9]+|[+\\-^=()])");
            Matcher matcher = pattern.matcher(formula.substring(position));
            if (!matcher.find()) {
                throw new Exception("Invalid symbol; start: " + position);
            }
            return matcher.group();
    Concrètement, la fonction parcourt chaque élément (Na, H ...) ou charactère spécial (+, =) et vérifie qu'il existe au moins une correspondance.
    Avec les différents essais de regex, quand j'arrive sur une composé comme FeC2O4⋅2H2O, soit ca plante au niveau du ., soit sur le composant après (ex: FeC2O4⋅2H2O + H2C2O4, ici plantage après H2C2O4), selon si je mets un | avant [\\.]

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    j'ai un peu l'impression que tu utilise le mauvais outils. Je ne pense pas (j'ai pas fait les calculs hein) qu'une expression régulière soit l'outil adapté à la validation d'une équation chimique. Il y a tellement de cas, que tu va vite finir avec un bousin impossible à maintenir. En fait, il existe déjà tout un pan de l'algorithmique concernant ton problème, ce sont les analyseurs syntaxique. Tu leur fournis les règles du langage de manière structurée et ça te pond un "compilateur" qui valide et transforme ton expression en un arbre facile à parcourir.

    je te suggérerais, même si c'est un peu plus lourd à prendre en mains, de t'orienter ce outils (type JFlex, ANTLR) qui te permettent de définir un langage correct pour tes expressions. J'ai personnellement joué à une époque lointaine avec ce genre d'outils pour parser des fichiers, c'est long à démarrer, mais une fois les règle de base en place ça deviens assez facile à étendre au fur et à mesure.

    En fouinant un peu l'internet, t'aura peut être la chance de trouver que quelqu'un a déjà écrit des grammaire pour les réactions chimique, tu dois pas être le premier avec ce genre de problème

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 475
    Points : 587
    Points
    587
    Par défaut
    A la base, je cherchais du code pour réaliser l'équilibrage de ces équations (ex: 2H2 + O2 = 2H2O). J'en ai trouvé un en java utilisant ANTLR et en js avec les regex. Je suis d'abord parti sur le code java, mais dès que j'ai voulu faire une amélioration , bref je ne me voyais pas me lancer dans tel bazar pour mon petit besoin.

Discussions similaires

  1. [RegEx] Expression régulière pour supprimer des doublons
    Par cbroissa dans le forum Langage
    Réponses: 5
    Dernier message: 20/05/2017, 01h59
  2. Expression régulière pour des URL
    Par Nerva dans le forum Autres Logiciels
    Réponses: 0
    Dernier message: 24/07/2013, 13h10
  3. [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
  4. [RegEx] Expression régulière pour réduire des URL
    Par kivan666 dans le forum Langage
    Réponses: 6
    Dernier message: 11/06/2006, 21h39
  5. [RegEx] Expression régulière pour trouver des mots
    Par cbroissa dans le forum Langage
    Réponses: 7
    Dernier message: 26/05/2006, 23h39

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