2010-07-06 5 views
2

J'ai besoin d'implémenter des expressions régulières dans un programme C++ que j'écris, et je voulais utiliser re2 mais je ne pouvais pas le compiler sous Windows. Est-ce que quelqu'un connaît une autre bibliothèque d'expressions régulières ou quelque chose de ce genre qui se compile facilement sur Windows et n'est pas un moteur regex "backtracking", mais une base basée sur la théorie des automates (quoi que ce soit) comme re2? Ou simplement trouver comment compiler re2 sur Windows serait parfait.Une alternative basée sur Automata à re2

+1

De quels problèmes de compilation s'agissait-il? –

+0

Les choses ne sont pas définies, principalement. Il y avait un milliard d'erreurs. Je peux les coller tous dans le codepad si cela peut aider. – Langley

+1

Je suis l'auteur du port sur Windows http://code.google.com/p/re2win/ faites juste attention à la conversion automatique en nombre entier (faites vous-même la conversion). – unixman83

Répondre

1

Les expressions régulières font partie de la norme TR1, donc vous avez probablement déjà un <tr1/regex> en-tête contains une classe std::tr1::regex et des fonctions connexes.

+0

Je ne connais pas du tout ce genre de choses, est-ce aussi rapide que re2? – Langley

+0

Et j'utilise Microsoft Visual C++, et je ne semble pas avoir un fichier . – Langley

+0

Wow, aurait dû lire le lien en premier. – Langley

1

Jetez un oeil à

http://www.complang.org/ragel/

Il est un DSL externe donc pas techniquement C++. Cependant, comme il génère pur C++/C à partir des expressions régulières, il devrait être beaucoup plus rapide que tout ce qui est construit au moment de l'exécution./

Par exemple.

action dgt  { printf("DGT: %c\n", fc); } 
action dec  { printf("DEC: .\n"); } 
action exp  { printf("EXP: %c\n", fc); } 
action exp_sign { printf("SGN: %c\n", fc); } 
action number { /*NUMBER*/ } 

number = (
    [0-9]+ $dgt ('.' @dec [0-9]+ $dgt)? 
    ([eE] ([+\-] $exp_sign)? [0-9]+ $exp)? 
) %number; 

main := (number '\n')*; 

get compilé en

st0: 
    if (++p == pe) 
     goto out0; 
    if (48 <= (*p) && (*p) <= 57) 
     goto tr0; 
    goto st_err; 
tr0: 
    { printf("DGT: %c\n", (*p)); } 
st1: 
    if (++p == pe) 
     goto out1; 
    switch ((*p)) { 
     case 10: goto tr5; 
     case 46: goto tr7; 
     case 69: goto st4; 
     case 101: goto st4; 
    } 
    if (48 <= (*p) && (*p) <= 57) 
     goto tr0; 
    goto st_err; 
Questions connexes