2017-02-02 7 views
3

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

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, но все уравнение, интересно, почему? Поскольку код работает в regex online tester как 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; 
} 
+1

Compiler? std :: regex, как известно, ошибочен в некоторых версиях gcc, вы можете использовать один форматированный форматирование. – Slava

+6

Кажется, что это гораздо проще решить с помощью рукописного анализатора. –

+0

@ pete-becker ok Я нашел это [ссылка] http://stackoverflow.com/questions/1806074/c-extract-polynomial-coefficients?rq=1 [ссылка], которая может быть полезна – ziKmouT

ответ

3

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

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

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

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

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

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

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

live demo выхода:

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

Ницца! .... спасибо – ziKmouT

Смежные вопросы