如何使用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"字。
答案 0 :(得分:3)
尝试std::string::find
和std::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转换回文本。