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

  1. ###raw>post.musername###
    Membre confirmé
    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&#8323₂ + 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
      0  0

  2. ###raw>post.musername###
    Expert confirmé
    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.
      0  0

  3. ###raw>post.musername###
    Membre confirmé
    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 [\\.]
      0  0

  4. #4
    Expert éminent sénior
    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
    David Delbecq Java developer chez HMS Industrial Networks AB.    LinkedIn | Google+

  5. #5
    Membre confirmé
    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.