我想用regex_replace简化的数学表达式迹象替换字符串,这里是一个示例代码:有条件使用boost :: regex_replace
string entry="6+-3++5";
boost::regex signs("[\-\+]+");
cout<<boost::regex_replace(entry,signs,"?")<<endl;
的输出是6 3 5?。我的问题是:如何用一些简洁的正则表达式工具获得6-3 + 5的正确结果?非常感谢。
试图与sregex_iterator和SMATCH别的东西,但仍然有一些问题:
string s="63--17--42+5555";
collect_sign(s);
Output is
63+17--42+5555+42+5555+5555
i.e.
63+(17--42+5555)+(42+5555)+5555
在我看来,这个问题是关系到match.suffix(),可能有人帮助吗? collect_sign函数基本上只是迭代每个符号串,如果“ - ”的数字是奇数/偶数,则将其转换为“ - ”/“+”,然后将符号的后缀表达式拼接在一起。
void collect_sign(string& entry)
{
boost::regex signs("[\-\+]+");
string output="";
auto signs_begin = boost::sregex_iterator(entry.begin(), entry.end(), signs);
auto signs_end = boost::sregex_iterator();
for (boost::sregex_iterator it = signs_begin; it != signs_end; ++it)
{
boost::smatch match = *it;
if (it ==signs_begin)
output+=match.prefix().str();
string match_signs = match.str();
int n_minus=count(match_signs.begin(),match_signs.end(),'-');
if (n_minus%2==0)
output+="+";
else
output+="-";
output+=match.suffix();
}
cout<<"simplify to: "<<output<<endl;
}
对不起,这不适用于像6--3 ++ 5这样的东西。预先感谢您提出任何进一步的建议。 – lychee10 2014-11-01 20:17:29
在这种情况下,你不希望'6-3 + 5'结果?你可以看到结果[link](http://regex101.com/r/yR4cT9/4) – Croises 2014-11-01 20:20:18
这是一个数学表达式,所以6--3 ++ 5应该是6 + 3 + 5。该规则基本上简化为 - 如果有奇数个 - 或否则。 – lychee10 2014-11-01 20:26:41