Я новичок в 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;
}
Когда вы создаете итератор регулярных выражений:
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
Других решений пока нет …