2014-11-01 48 views
0

我想用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; 
} 

回答

0

用途:

[+\-*\/]*([+\-*\/]) 

替换:

$1 

您可以测试here

+0

对不起,这不适用于像6--3 ++ 5这样的东西。预先感谢您提出任何进一步的建议。 – lychee10 2014-11-01 20:17:29

+0

在这种情况下,你不希望'6-3 + 5'结果?你可以看到结果[link](http://regex101.com/r/yR4cT9/4) – Croises 2014-11-01 20:20:18

+0

这是一个数学表达式,所以6--3 ++ 5应该是6 + 3 + 5。该规则基本上简化为 - 如果有奇数个 - 或否则。 – lychee10 2014-11-01 20:26:41

0

如果你只是想要一个数学上的简洁,你可以使用:

s = boost::regex_replace(s, boost::regex("(?:++|--"), "+", boost::format_all); 
s = boost::regex_replace(s, boost::regex("(?:+-|-+"), "-", boost::format_all); 
+0

当然,但是有可能使它更一般吗? Python控制台可以处理6 +++ 3 - + - 5之类的东西。 – lychee10 2014-11-01 20:49:57

+0

我只是编辑代码,现在试试它是否可以 – Croises 2014-11-01 21:10:20