Вы используете не то, что нужно - regex_match
предназначен для проверки того, соответствует ли (одно) регулярное выражение всей последовательности символов.Таким образом, вам нужно либо указать регулярное выражение, которое соответствует всему вводу, либо использовать что-то еще.В вашей ситуации , вероятно, имеет смысл просто изменить регулярное выражение, как вы уже сделали (сгруппируйте его и добавьте звезду Клини).Если вы хотите перебрать отдельные термины полинома, вы, вероятно, захотите использовать что-то вроде regex_token_iterator
.
Редактировать: Конечно, поскольку вы встраиваете это в C ++, у вас также естьудвоить все ваши обратные слеши.Глядя на это, я также немного смущен тем, что вы используете регулярное выражение - мне не кажется, что оно действительно должно работать совершенно правильно.Например, требует"+", "-" или "^" в начале термина, но обычно первый термин не имеет этого.Я также несколько сомневаюсь, почему в начале термина должен стоять знак «^».Так как показатель степени обычно опускается, когда он равен нулю, вероятно, лучше его пропустить.Принимая это во внимание, я получаю что-то вроде: «[- +]? (\ D *) x (\ ^ ([0-9]) *)».
Включив это в некоторый код, мы можем получить что-то вроде этого:
#include <iterator>
#include <regex>
#include <string>
#include <iostream>
int main() {
std::string poly = "4x^2+3x^1+2x";
std::tr1::regex term("[-+]?(\\d*)x(\\^[0-9])*");
std::copy(std::tr1::sregex_token_iterator(poly.begin(), poly.end(), term),
std::tr1::sregex_token_iterator(),
std::ostream_iterator<std::string>(std::cout, "\n"));
return 0;
}
По крайней мере для меня, который печатает каждый термин индивидуально:
4x ^ 2
+ 3x ^ 1
+ 2x
Обратите внимание, что на данный момент я только что распечатал каждый полный термин и изменил ваш ввод, чтобы показать способность распознавать термин, который невключите степень (в любом случае, явно).
Редактировать: чтобы собрать результаты в вектор вместо отправки их на std::cout
, вы должны сделать что-то вроде этого:
#include <iterator>
#include <regex>
#include <string>
#include <iostream>
int main() {
std::string poly = "4x^2+3x^1+2x";
std::tr1::regex term("[-+]?(\\d*)x(\\^[0-9])*");
std::vector<std::string> terms;
std::copy(std::tr1::sregex_token_iterator(poly.begin(), poly.end(), term),
std::tr1::sregex_token_iterator(),
std::back_inserter(terms));
// Now terms[0] is the first term, terms[1] the second, and so on.
return 0;
}