Regex : capturer toutes les itérations d'un groupe capturant + - Javascript/Node.js - Programmation
Marsh Posté le 18-02-2018 à 15:31:07
Bonjour,
Pas tout compris à ton exemple simplifié alors je me suis permis d'en refaire un :
- première unité : "a" ou "b"
- multiplicateur de la première unité : "M" ou "k" ou aucun
- seconde unité : "x" ou "y"
- multiplicateur de la seconde unité : "m" ou "µ" ou aucun
Expression de la forme : [nom du résultat][signe de comparaison][nombre][multiplicateur de première unité optionnel][première unité][opérateur d'unité composée][multiplicateur de seconde unité optionnel][seconde unité]
Code :
|
Mais j'ai du mal à comprendre ce que tu attends au niveau du signe de comparaison et de l'opérateur d'unité composée.
Tu auras vraiment autre chose que des "=" pour le signe de comparaison ? Genre des ">" ou même des ">=" ?
Pareil, pour l'unité tu attends toujours une unité composée ? Peux-tu avoir des unités composées avec des opérateurs implicites (i.e. "MWh" ) ?
Marsh Posté le 18-02-2018 à 17:08:51
Merci de ta réponse.
Oui tu as compris, juste un petit truc, dans une unité, il ne peut y avoir qu'un seul multiple, genre des newton-mètres peuvent être en mNm (mili Newton mètre, mais pas en mNmm (mill Newton milimètre)
Et oui, l'idée est de couvrir n'importe quelle combinaison d'unitée. Par exemple 1 J = 1 kg.m2.s-2 .
Donc il faut mettre un + après ton a|b et x|y, et là, c'est le drame car comme le dit la doc "A repeated capturing group will only capture the last iteration."...
Au final, j'ai avancé en le faisant en plusieurs fois : une fois l'unité isolée, je la sépare en deux s'il y a un signe divisé ou pas, et je traite les une ou deux parties ensuite.... C'est moins élégant que d'avoir réussi à faire une méga regex qui fait tout d'un coup, mais au final, ça fera du code peut être plus simple à relire...
Mais pour la démarche, la question est toujours d'actualité. Indépendamment du sujet, la question est :
Comment capturer toutes les itérations d'un groupe capturant "+"?
Marsh Posté le 18-02-2018 à 17:32:45
J'aurai utilisé un groupe npon capturant
Code :
|
En plus de détails:
- Capture de l'identifiant + comparaison + nombre (avec virgule ou point): (\w+)([\>\<\=]+)([\d\.\,]+)
- Capture de l'unité avec un groupe non capturant incluant les unités atomiques ((?:<unité atomique> )+)
- Ensuite définition d'une unité atomique: [pnµmkM]?[gmNsWh](?:-?\d+)?
- Et le séparateur d'unité éventuel: [\.\/]?
Cette regexp laissera passer plein de truc invalide, mais en supposant que ta chaine ne comporte pas nimp.
Marsh Posté le 18-02-2018 à 19:07:50
Le problème reste le même, comme dit, on ne peut pas capturer un nombre indéfini de motifs, c'est soit 0 soit 1 mais pas plus.
De toute façon je pense si c'était possible tu partirais sur une variable illisible. Je serai parti sur une capture des principaux éléments pour ensuite retravailler sur l'unité entière qui aura été capturée :
Code :
|
Normalement comme ça tu gardes les infos nécessaires à une éventuelle conversion et peux y accéder facilement.
EDIT : version plus propre...
Marsh Posté le 18-02-2018 à 12:11:16
Bonjour,
Je n'arrive pas à finaliser mon expression régulière, peut-être qu'il y aura un expert parmi vous qui saura m'aider Voici formellement l'énoncé :
La première expression rationnelle qui vient est :
Testons là sur :
Le problème est que comme le fait remarquer l'analyseur de RegEx https://regex101.com/:
A repeated capturing group will only capture the last iteration. Put a capturing group around the repeated group to capture all iterations or use a non-capturing group instead if you're not interested in the data
Donc ce qu'il revient est très logiquement :
Si j'applique la solution proposée par l'analyseur l'expression régulière devient :
et on obtient une fois appliqué sur le même string :
Mais ce n'est toujours pas ce que je veux , moi je veux
Quelqu'un aurait une idée ?
Merci !
Edit : je me penche vers une analyse en plusieurs fois bouclant sur une application de RegExp.prototype.exec() (voir en bas de https://developer.mozilla.org/fr/do [...] egExp/exec), mais ça ne me satisfait pas des tonnes...
Message édité par naeco le 18-02-2018 à 12:16:03