Частичное совпадение с учетом регистра с регулярным выражением Boost - PullRequest
0 голосов
/ 15 апреля 2009

Из следующего кода я ожидаю получить этот вывод из соответствующего ввода:

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

Но почему он дает «Нет совпадения» для ввода 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;
}

Обновление:

Наконец, это работает со следующим подходом:

#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;
}

Ответы [ 2 ]

1 голос
/ 15 апреля 2009

Используйте regex_search вместо regex_match.

0 голосов
/ 15 апреля 2009

Ваше регулярное выражение должно учитывать символы в начале и конце подстроки "FOO". Я не уверен, но "FOO *" может сделать трюк

match_partial вернет true только если частичная строка найдена в конце ввода текста, а не в начале.

Частичное совпадение - это совпадение один или несколько символов в конце ввод текста, но не соответствует всем регулярного выражения (хотя это возможно, сделал так, если бы больше информации было имеется)

Таким образом, FOOBAR в сочетании с "FOO" вернет false. Как предполагает другой ответ, использование regex.search позволит вам более эффективно искать подстроки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...