2010-04-10 15 views
1

je la chaîne suivante:analyse syntaxique/occurrence de chaîne correspondant en C

const char *str = "\"This is just some random text\" 130 28194 \"Some other string\" \"String 3\"" 

Je voudrais obtenir le nombre entier 28194 bien sûr l'entier varie, donc je ne peux pas faire strstr("20194").

Alors je me demandais ce qui serait un bon moyen d'obtenir cette partie de la chaîne?

Je pensais utiliser #include <regex.h> dont j'ai déjà une procédure pour faire correspondre les regexp mais je ne sais pas comment l'expression rationnelle dans C ressemblera à la notation de style POSIX. [:alpha:]+[:digit:] et si la performance sera un problème. Ou sera-ce mieux en utilisant strchr,strstr?

Toutes les idées seront apprécient

Répondre

0

Si vous souhaitez utiliser regex, vous pouvez utiliser:

const char *str = "\"This is just some random text\" 130 28194 \"Some other string\" \"String 3\""; 
regex_t re; 
regmatch_t matches[2]; 
int comp_ret = regcomp(&re, "([[:digit:]]+) \"", REG_EXTENDED); 
if(comp_ret) 
{ 
    // Error occured. See regex.h 
} 
if(!regexec(&re, str, 2, matches, 0)) 
{ 
    long long result = strtoll(str + matches[1].rm_so, NULL, 10); 
    printf("%lld\n", result); 
} 
else 
{ 
    // Didn't match 
} 
regfree(&re); 

Vous avez raison qu'il existe d'autres approches.

EDIT: modifié pour utiliser la répétition non facultative et afficher plus de vérification des erreurs.

+0

Merci, cela semble faire le travail plutôt bien. Des problèmes de performances peuvent-ils survenir en utilisant regexp au lieu de l'analyse de chaîne? Je suis en train d'analyser ~ 1M lignes – David

+0

Je pense que regex est une approche valide ici. L'expression régulière ne devrait pas du tout faire marche arrière. Notez que vous ne devez compiler qu'une fois l'expression régulière, et vous pouvez également réutiliser le tableau 'matches'. Comme toujours, profil pour être sûr. –