std :: regex для определения коэффициента полиномиального уравнения

Я новичок в C ++, и меня просят создать решатель полиномиальной функции второй степени. Для этого мне сначала нужно разобрать уравнение и уменьшить его, чтобы показать его в сокращенной форме, т.е.

8 * X^0 - 6 * X^1 + 5.6 * X^2 = 3 * X^0
становится
5 * X^0 - 6 * X^1 + 5.6 * X^2 = 0

После нескольких часов просмотра различных синтаксисов я обнаружил, что следующее регулярное выражение [0-9]+(?=.?[*](?=.?(?=(X\^0)))) идентифицировать 8 а также 3 в качестве коэффициентов (все еще необходимо обработать отрицательный знак tho).

Моя проблема в следующем коде с библиотекой <regex> кажется, не дает мне 8 а также 3 но все уравнение, интересно почему? Потому что код работает в регулярное тестирование онлайн как full match 1 а также full match 2, Интересно, не потому ли это, что у меня тоже есть группы, которые немного запутались ..

#include <iostream>
#include <regex>
using namespace std;
int main()
{
string var = "8 * X^0 - 6 * X^1 + 5.6 * X^2 = 3 * X^0";

regex wsaq_re("[-](?=.?[0-9](?=.?[*](?=.?(?=(X^0)))))");
copy( sregex_token_iterator(var.begin(), var.end(), wsaq_re, -1),
sregex_token_iterator(),
ostream_iterator<string>(cout, "\n"));

return 0;
}

3

Решение

Когда вы создаете итератор регулярных выражений:

sregex_token_iterator(var.begin(), var.end(), wsaq_re, -1)

-1 в качестве третьего параметра средства

submatch — индекс субматча, который должен быть возвращен. «0» представляет все совпадение, а «-1» представляет части, которые
не соответствует (например, материал между матчами).

Вы должны поставить 1 там.

Также ваше регулярное выражение слишком усложнено ИМХО, этого должно быть достаточно:

regex wsaq_re( "(=?\\s*\\-?\\s*\\d+\\s*\\*\\s*X\\s*\\^\\d+)");

живое демо вывод:

8 * X^0
- 6 * X^1
6 * X^2
= 3 * X^0
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]