使用正则表达式拆分数学表达式
Split a mathematical expression using regex
我想使用正则表达式将以下数学表达式 -1+33+4.4+sin(3)-2-x^2
拆分为标记。我使用以下站点来测试我的正则表达式 link, this says that nothing wrong. When I implement the regex into my C++, throwing the following error Invalid special open parenthesis
I looked for the solution and I find the following Whosebug site ,但它并没有帮助我解决我的问题。
我的正则表达式代码是 (?<=[-+*\/^()])|(?=[-+*\/^()])
。在 C++ 代码中我不使用 \
.
另一个问题是我不知道如何判断减号是一元运算符还是二元运算符,如果减号是一元运算符我想这样{-1}
我希望代币看起来像这样:{-1,+,33,+4.4,+,sin,(,3,),-,2,-,x,^,2}
一元减号可以在字符串中的任何位置。
如果我不使用^
还是错了
代码:
std::vector<std::string> split(const std::string& s, std::string rgx_str) {
std::vector<std::string> elems;
std::regex rgx (rgx_str);
std::sregex_token_iterator iter(s.begin(), s.end(), rgx);
std::sregex_token_iterator end;
while (iter != end) {
elems.push_back(*iter);
++iter;
}
return elems;
}
int main() {
std::string str = "-1+33+4.4+sin(3)-2-x^2";
std::string reg = "(?<=[-+*/()^])|(?=[-+*/()^])";
std::vector<std::string> s = split(str,reg);
for(auto& a : s)
cout << a << endl;
return 0;
}
C++ 默认使用 modified ECMAScript regular expression grammar 作为其 std::regex
。它确实支持先行 (?=)
和 (?!)
,但不支持先行。因此,(?<=)
不是有效的 std::regex
语法。
有a proposal在C++23中添加这个,但目前没有实现。
我想使用正则表达式将以下数学表达式 -1+33+4.4+sin(3)-2-x^2
拆分为标记。我使用以下站点来测试我的正则表达式 link, this says that nothing wrong. When I implement the regex into my C++, throwing the following error Invalid special open parenthesis
I looked for the solution and I find the following Whosebug site (?<=[-+*\/^()])|(?=[-+*\/^()])
。在 C++ 代码中我不使用 \
.
另一个问题是我不知道如何判断减号是一元运算符还是二元运算符,如果减号是一元运算符我想这样{-1}
我希望代币看起来像这样:{-1,+,33,+4.4,+,sin,(,3,),-,2,-,x,^,2}
一元减号可以在字符串中的任何位置。
如果我不使用^
还是错了
代码:
std::vector<std::string> split(const std::string& s, std::string rgx_str) {
std::vector<std::string> elems;
std::regex rgx (rgx_str);
std::sregex_token_iterator iter(s.begin(), s.end(), rgx);
std::sregex_token_iterator end;
while (iter != end) {
elems.push_back(*iter);
++iter;
}
return elems;
}
int main() {
std::string str = "-1+33+4.4+sin(3)-2-x^2";
std::string reg = "(?<=[-+*/()^])|(?=[-+*/()^])";
std::vector<std::string> s = split(str,reg);
for(auto& a : s)
cout << a << endl;
return 0;
}
C++ 默认使用 modified ECMAScript regular expression grammar 作为其 std::regex
。它确实支持先行 (?=)
和 (?!)
,但不支持先行。因此,(?<=)
不是有效的 std::regex
语法。
有a proposal在C++23中添加这个,但目前没有实现。