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é :
- j'ai un string qui contient quelque chose de la forme : puissance=48MW/h
- Je veux récupérer le libellé, le signe de comparaison, le nombre et tout le détail des unités, soit ici :
- puissance, = , 48, M, W, / et enfin h
- La première partie, aucun problème donc nous allons nous focaliser uniquement sur l'unité.
- Pour simplifier, nous allons dire qu'il y a que 2 multiples c et m, qu'il y a que 4 unités possibles W, h, Z et y
- Et pour bien visualiser quel groupe capture quoi, on va dire que les unités pouvant avant le slash seront W et h, être après le slash sont Z et y
- Je ne double volontairement pas les slashs qui devraient l'être pour pouvoir tester facilement les expressions rationnelles dans https://regex101.com/
La première expression rationnelle qui vient est :
Code :
- var regex = new RegExp("(c|m)?(h|W)+(?:([\/]?)(Z|y)+)?","ug" );
|
Testons là sur :
Le problème est que comme le fait remarquer l'analyseur de RegEx https://regex101.com/:
Citation :
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 :
Code :
- Match 1
- Full match 0-6 `mWh/Zy`
- Group 1. n/a `m`
- Group 2. n/a `h`
- Group 3. n/a `/`
- Group 4. n/a `y`
|
Si j'applique la solution proposée par l'analyseur l'expression régulière devient :
Code :
- var regex = new RegExp("(c|m)?((?:h|W)+)(?:([\/]?)((?:Z|y)+))?","ug" );
|
et on obtient une fois appliqué sur le même string :
Code :
- Full match 0-6 `mWh/Zy`
- Group 1. n/a `m`
- Group 2. n/a `Wh`
- Group 3. n/a `/`
- Group 4. n/a `Zy`
|
Mais ce n'est toujours pas ce que je veux
, moi je veux
Code :
- Full match 0-6 `mWh/Zy`
- Group 1. n/a `m`
- Group 2. n/a `W`
- Group 3. n/a `h`
- Group 4. n/a `/`
- Group 5. n/a `Z`
- Group 6. n/a `y`
|
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