У меня есть выражения, которые могут быть предоставлены пользователем, такие как:
a*sin(w*t)
a+b/c
x^2+y^2/2
И я бы хотел просто получить список переменных там. Мне не нужно делать никаких замен. Итак, для первой формулы это будет {a,w,t}
, Для второго {a,b,c}
и для последнего {x,y}
,
Выражение в первую очередь написано для анализа с помощью Sympy, но мне нужно иметь возможность получить список переменных в C ++ для некоторых проверок. Я бы хотел:
muparser
, но я не знаю, предоставляют ли какие-либо из них такую функциональностьКакой самый простой способ сделать это? Как бы вы решили эту проблему?
Учитывая вход: const string input
мы можем собрать или переменные в set<string>
с регулярное выражение:
\b([a-zA-Z]\w*)(?:[^(a-zA-Z0-9_]|$)
Вы можете использовать это в C ++ следующим образом:
const regex re{ "\\b([a-zA-Z]\\w*)(?:[^(a-zA-Z0-9_]|$)" };
const set<string> output{ sregex_token_iterator(cbegin(input), cend(input), re, 1), sregex_token_iterator() };
РЕДАКТИРОВАТЬ:
regex
объяснение:
\b
утверждает \W
символ или начало или конец строки([a-zA-Z]
захватывает все, что начинается с буквенного символа\w*)
с последующим любым количеством символов «слово»(?:
указывает начало моего необязательного совпадения[[^(a-zA-Z0-9_]
1улица опция не является открывающей скобкой \W
персонаж|$)
другой вариант заключается в том, что был достигнут конец вводаДругих решений пока нет …