2016-11-14 6 views
0

Je dois convertir l'EBNF suivant en une expression régulière qui correspond à toute chaîne de format valide. Par exemple '< 8', '*^10', '+ 6', '15, .2', etc.Conversion d'EBNF en expression rationnelle

<spec> -> :[[<fill>]<align>][<sign>][<width>][,][.<prec>] 
<fill> -> <character> (* i.e., any one character) 
<align> -> < | > | = |^
<sign> -> + | - | ' ' 
<width> -> <integer> (* i.e, one or more digits 0....9 *) 
<prec> -> <integer> 
+0

Montrez-nous ce que vous avez essayé – nozzleman

Répondre

0

Si le moteur regex prend en charge la capture des groupes nommés (fe) PCRE alors cela pourrait fonctionner :

^((?<fill>.?)(?<align>[<>=^]))?(?<sign>[ +\-]?)(?<width>[0-9]+)[,]?(?:[.](?<prec>[0-9]+))?$ 

test here

Notez que la plupart est facultative, sauf pour la capture "largeur" ​​groupe. C'est une hypothèse basée sur le fait que la "largeur" ​​existe dans tous les exemples.

Utilisation des groupes de capture sans nom, la regex devient plus courte:

^((.?)([<>=^]))?([ +\-]?)([0-9]+)[,]?(?:[.]([0-9]+))?$