C ++ 11 std :: regex взгляд за альтернативой - PullRequest
3 голосов
/ 26 октября 2019

Я пытаюсь создать класс в 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 для этого?

1 Ответ

2 голосов
/ 26 октября 2019

Здесь вы можете использовать границу без слов:

std::regex exprZero{R"(\B\([^(),]+\))"};

См. Демо regex

Шаблон \B\([^(),]+\) будет соответствовать (, которыйлибо в начале строки, либо сразу после несловарного символа (символ, отличный от буквы, цифры или _), [^(),]+ будет использовать 1 или более символов, отличных от (, ) и,, а затем \) будет соответствовать ) char.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...