Я пытаюсь создать класс в C ++ 11 для вычисления математической формулы, заданной как std :: string.
std::string formula = "sqrt(3)+15*3*(2+3*4)+pow(2,3)+(2*(1+8))-(3*(1+pow(2,4)))";
Я решил использовать std :: regex для поиска шаблонов, взять их,рассчитать их и заменить их результатом расчета. Чтобы вычислить эту формулу, я сделал 3 шаблона:
std::regex exprOne{ "[a-zA-Z0-9]+\\([^(),]+\\)" };
std::regex exprTwo{ "[a-zA-Z0-9]+\\([^()]+\\)" };
std::regex exprZero{ "(?![a-z0-9])\\([^(),]+\\)" };
совпадений exprOne sqrt(3)
exprTwo совпадений pow(2,3)
и pow(2,4)
, но проблема в exprZero, который должен соответствовать (2+3*4)
и (1+8)
, но это также соответствует sqrt(3)
. В интернете я нашел lookbehind (?<![a-z0-9])
, но std :: regex не имеет lookbehind, как я нашел в интернете. Некоторые предлагают использовать Boost.Regex, но я не хочу использовать внешние библиотеки. Если std :: regex не имеет lookbehind, вы должны быть в состоянии сделать то же самое, не используя его?
exprZero не должен совпадать с sqrt([^(),]+)
, log([^(),]+)
, log10([^(),]+)
и так далее, но должен совпадать([^(),]+)
.
Есть ли здесь шаблон в std :: regex для этого?