C ++ 11 Regexpression

时间:2016-05-20 04:40:30

标签: c++ regex c++11 visual-c++

如何使用C ++ 11 RegEx查找" time"按以下方式:

"time = '1212232' or raisetime ='1212' or AlarmParameter1 = 'abc time cd'"

并将其转换为:

 "timeStamp = '1212232' or raisetime ='1212' or AlarmParameter1 = 'abc time cd'". 

它不应该影响其他" time"字。

4 个答案:

答案 0 :(得分:3)

尝试std::string::findstd::string::replace的组合。

这得到了这个位置:

size_t f = s.find("time");

这取代了文字:

s.replace(f, std::string("time").length(), "timeStamp");

源代码: http://cpp.sh/3ljv

int main()
{
  std::string name = "time = '1212232' or raisetime ='1212' or AlarmParameter1 = 'abc time cd'";
  size_t f = name.find("time");
  std::cout << name.replace(f, std::string("time").length(), "timeStamp");
}

<强>输出:

  

timeStamp ='1212232'或raisetime ='1212'或AlarmParameter1 ='abc time cd

如果要替换所有匹配项,可以使用如下函数:

bool replace(std::string& str, const std::string& from, const std::string& to) {
    size_t start_pos = str.find(from);
    if(start_pos == std::string::npos)
        return false;
    str.replace(start_pos, from.length(), to);
    return true;
}

replace(str, "time", "timeStamp");

答案 1 :(得分:2)

如果需要使用正则表达式,那么最简单的解决方案可能是这样的:

finalPrice()

它会将“time ='123'”之类的字符串替换为“timeStamp ='123'”

输出:

  

raisetime ='1212'或AlarmParameter1 ='abc time cd'或timeStamp ='1212232'

答案 2 :(得分:1)

如果我们考虑您的示例输入...

  

&#34; time =&#39; 1212232&#39;或者提高时间=&#39; 1212&#39;或者AlarmParameter1 =&#39; abc time cd&#39;&#34;

......有两件事情非常明显:

  • 如果它不是单引号字符串,只是寻找字边界,&#34;时间&#34;,一些可选的空格,然后&#34; =&#34; ,工作得很好:regexp \btime\s*=

  • 单引号字符串会使事情变得非常复杂,需要相当高级的正则表达式规则,因为上面的内容可能与引用的内容相匹配(由于检查=,它与您的示例无关,但会匹配AlarmParameter1 = 'abc time = cd'

这表明了一个简单的解决方案:

  • 复制输入字符串

  • 迭代该副本,用空格替换单引号内的任何内容

  • 应用正则表达式搜索\b(time)\s*=来查找&#34;时间&#34;感兴趣的子匹配

  • 再次遍历副本,从原始字符串中恢复单引号内的任何内容

  • 用替换文本替换子匹配(使用为子匹配报告的字符串索引)

与仅使用正则表达式的解决方案相比,它需要更多代码行,但更容易正确和维护。

答案 3 :(得分:-1)

为了可靠地执行此操作,您无法使用正则表达式。

您需要将代码段解析到AST中,更改所有出现的标识符 time,然后将AST转换回文本。