2009-04-15 8 views
0

, je compte obtenir cette sortie de l'entrée correspondante:Match partiel avec à partir du code suivant de Boost Regex

Input: FOO  Output: Match 
Input: FOOBAR Output: Match 
Input: BAR  Output: No Match 
Input: fOOBar Output: No Match 

Mais pourquoi il donne « Pas de match » pour l'entrée FOOBAR?

#include <iostream> 
#include <vector> 
#include <fstream> 
#include <sstream> 
#include <boost/regex.hpp> 
using namespace std; 
using namespace boost; 


int main (int arg_count, char *arg_vec[]) { 
    if (arg_count !=2) { 
     cerr << "expected one argument" << endl; 
     return EXIT_FAILURE; 
    } 

    string InputString = arg_vec[1]; 
    string toMatch = "FOO"; 

    const regex e(toMatch); 
    if (regex_match(InputString, e,match_partial)) { 
     cout << "Match" << endl; 
    } else { 
     cout << "No Match" << endl; 
    } 


    return 0; 
} 

Mise à jour:

Enfin, il fonctionne avec l'approche suivante:

#include <iostream> 
#include <vector> 
#include <fstream> 
#include <sstream> 
#include <boost/regex.hpp> 
using namespace std; 
using namespace boost; 

bool testSearchBool(const boost::regex &ex, const string st) { 
    cout << "Searching " << st << endl; 
    string::const_iterator start, end; 
    start = st.begin(); 
    end = st.end(); 
    boost::match_results<std::string::const_iterator> what; 
    boost::match_flag_type flags = boost::match_default; 
    return boost::regex_search(start, end, what, ex, flags); 
} 


int main (int arg_count, char *arg_vec[]) { 
    if (arg_count !=2) { 
     cerr << "expected one argument" << endl; 
     return EXIT_FAILURE; 
    } 

    string InputString = arg_vec[1]; 
    string toMatch = "FOO*"; 

    static const regex e(toMatch); 
    if (testSearchBool(e,InputString)) { 
     cout << "MATCH" << endl; 
    } 
    else { 
     cout << "NOMATCH" << endl; 
    } 

    return 0; 
} 

Répondre

0

Votre expression régulière doit tenir compte des caractères au début et à la fin de la sous-chaîne « FOO ". Je ne suis pas sûr mais "FOO *" pourrait faire l'affaire

match_partial ne retournerait vrai que si la chaîne partielle a été trouvée à la fin de l'entrée de texte, pas le début.

Un match partiel est celui qui correspond un ou plusieurs caractères à la fin de l'entrée de texte, mais ne correspondait pas à tous de l'expression régulière (bien qu'il peut avoir fait avait été plus entrée disponible)

Donc FOOBAR associé à "FOO" retournerait false. Comme l'indique l'autre réponse, l'utilisation de regex.search vous permettrait de rechercher plus efficacement des sous-chaînes.

+0

@Gayan: J'ai essayé, string toMatch = "FOO *"; Cela ne correspond toujours pas. – neversaint

+0

C'était juste une intuition. Je n'ai pas le luxe d'écrire une application de test en utilisant boost. Désolé – Gayan

+0

Ce n'est pas une extension de shell. "FOO *" serait un "F", suivi d'un "O" suivi de zéro ou plus de "O". – Svante

1

Utilisez regex_search au lieu de regex_match.