Alors pourquoi cela ne fonctionne-t-il pas? Je crée une regex qui correspondra à une formule (qui fait ensuite partie d'une description standard plus grande). Mais je suis coincé ici, car il ne semble pas vouloir correspondre aux formules intégrées dans une formule.
stat = /(Stat3|Stat2|Stat1)/
number_sym = /[0-9]*/
formula_sym = /((target's )?#{stat}|#{number_sym}|N#{number_sym})\%?/
math_sym = /(\+|\-|\*|\/|\%)/
formula = /^\((#{formula}|#{formula_sym})( #{math_sym} (#{formula}|#{formula_sym}))?\)$/
p "(target's Stat2 * N1%)".match(formula).to_s #matches
p "((target's Stat2 * N1%) + 3)".match(formula).to_s #no match
p "(Stat1 + ((target's Stat2 * N1%) + 3))".match(formula).to_s #no match
3 Réponses :
Lorsque vous utilisez le pour obtenir la chaîne que vous souhaitez (dans mon exemple, "bla"), utilisez la source # {} code> Syntaxe, Ruby convertit l'objet RegexP vers une chaîne à l'aide de TO_S code>. Regardez ce qui se passe lorsque vous convertissez un objet REGEXP en une chaîne: Regexp # Source Code> Méthode: P> formula_sym = /((target's )?#{stat.source}|#{number_sym.source}|N#{number_sym.source})\%?/
merci ... et j'ai découvert pourquoi cela ne fonctionnait pas ... Devinez que j'aurais dû former ma question comme "Comment puis-je le faire fonctionner" ... on dirait que # {formule.source} a montré que la formule était toujours néant.
Vous ne pouvez pas utiliser de récursion comme celle-ci: le # {formule} code> s dans votre définition de formule code> est convertie en chaînes vides. Ce que vous voulez, c'est au-delà de la capacité d'expression régulière - les expressions régulières ne peuvent même pas correspondre aux parenthèses imbriquées. Je suppose que vous aurez besoin d'un analyseur réel pour faire ce que vous voulez. Découvrez Treetop , par exemple . P>
Excellent ... Treetop me permettra de migrer facilement ma spécification de définition actuelle. Merci!
/(
(?<non_grouping_char>
[^\(\{\[\<\)\}\]\>]
){0}
(?<parens_group>
\( \g<content> \)
){0}
(?<brackets_group>
\[ \g<content> \]
){0}
(?<chevrons_group>
\< \g<content> \>
){0}
(?<braces_group>
\{ \g<content> \}
){0}
(?<balanced_group>
(?>
\g<parens_group> |
\g<brackets_group> |
\g<chevrons_group> |
\g<braces_group>
)
){0}
(?<content>
(?> \g<balanced_group> | \g<non_grouping_char> )*
){0}
\A \g<content> \Z
)/uix
Beer me if this helps you. Works for me. Works in any regexp engine that allows named groups. It will validate any content that has either no groups, or groups of nesting characters, to any depth.
Si nous nous rencontrons, assurez-vous de vous payer une bière. Quelle est votre saveur préférée? :) Depuis lors, je vote!