Je suis un débutant dans les expressions régulières, j'apprécierais donc un peu de commentaires de nos pairs sur celui-ci. Il sera très utilisé sur mon site, donc tous les cas de bords bizarres peuvent totalement faire des ravages. L'idée est de saisir une quantité d'un ingrédient dans une recette en unités entières ou en fractions. En raison de mon mécanisme d'auto-complétion, juste un nombre est valide aussi (puisqu'il fera apparaître une liste déroulante). Ces lignes sont valables:Un moyen d'améliorer cette expression régulière?
1
1/2
1 1/2
4 cups
4 1/2 cups
10 3/4 cups sliced
La partie numérique de la ligne doit être son propre groupe, je peux analyser avec mon analyseur de fraction. Tout après la partie numérique devrait être un deuxième groupe. Au début, j'ai essayé ceci:
^\s*(\d+|\d+\/\d+|\d+\s*\d+\/\d+)\s*(.*)$
Ce presque fonctionne, mais "1 1/2 tasse" va s'analysable comme (1) (1/2 tasse) au lieu de (1 1/2) et (tasses). Après m'être gratté un peu la tête, j'ai déterminé que c'était à cause de la commande de ma clause «OU». (1) satisfait le \ d + et (. *) Satisfait le reste. J'ai donc changé cela:
^\s*(\d+\/\d+|\d+\s*\d+\/\d+|\d+)\s*([a-z].*)$
Cela fonctionne presque, mais permet bizarreries telles que « 1 1/2/4 tasses » ou « 1/2 3 tasses ». Je décide donc d'appliquer une lettre que le premier caractère après une expression numérique valide:
^\s*(\d+\/\d+|\d+\s*\d+\/\d+|\d+)\s*($|[a-z].*)$
Remarque Je suis en ce en mode insensible à la casse. Voici mes questions:
L'expression peut-elle être améliorée? Je n'aime pas du tout la liste "OU" pour le nombre, la fraction, la fraction composée mais je ne pouvais pas penser à un moyen d'autoriser des nombres entiers, des fractions ou des fractions composées.
Ce serait très bien si je pouvais retourner un groupe pour chaque mot après le composant numérique. Comme un groupe pour (10 3/4), un groupe pour (tasses) et un groupe pour (tranché). Il peut y avoir n'importe quel nombre de mots après. Est-ce possible?
Merci!
Oh oups, manqué encore un cas .. La quantité peut être exprimée en décimal. J'ai donc ajouté une clause OU: ^ \ s * (\ d + \/\ d + | \ d + \ s * \ d + \/\ d + | \ d + | \ d * \. \ D) \ s * ($ | [az]. *) $ –