使用正则表达式将int替换为带有标准容器的for语句中的size_t

时间:2012-08-23 11:29:44

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

我有一个非常古老的大型x86项目,现在我需要将它移植到x64架构。 不幸的是,混合int / memsize类型有很多错误。例如:

std::vector<T> vec;
for(int i = 0; i < vec.size(); ++i) // error, i must be size_t
{
}

所以我想要的是将int更改为size_t来替换所有这些字符串。 形式上,问题可以说如下:

查找符合以下条件的字符串:

for(int [var name] = 0; [var name] < [container name].size(); [any expression]) 

将其替换为:

for(size_t [var name] = 0; [var name] < [container name].size(); [any expression])

我正在使用visual studio 2008.我正在寻找解决此问题的最正确方法。 谢谢。

2 个答案:

答案 0 :(得分:1)

正则表达式可以找到:for[:b\n]*\([:b\n]*int[:b\n]+{:i}[:b\n]*=[:b\n]*0[:b\n]*;[:b\n]*{:i}[:b\n]*\<[:b\n]*{:i}\.size[:b\n]*\([:b\n]*\);[:b\n]*

替换为:for(size_t \1 = 0; \2 < \3.size();(注意结束空格)

答案 1 :(得分:0)

“最正确的解决方案”可能涉及使用理解C ++语法的解析器,然后在操作解析树后使用该解析器重写代码。 C ++语法并不简单,对于像这样的任务,除非项目特别大,否则你很可能不得不恢复使用在大多数情况下工作的东西,而不是在技术上正确。

最简单的方法可能是编写一组搜索/替换正则表达式来完成这项工作,正则表达式近似于可能的用例,但从下面的例子中可以看出,正则表达式很可能是难以阅读。

这是一个用Python编写的实用程序,它近似于你要做的事情。它将在stdin或命令行上获取一个文件,并在stdout上生成转换后的文本。正则表达式严格匹配相同的标识符。

#!/usr/bin/env python

import fileinput
import sys
import re

regex = re.compile(
    r"""(?P<start>^\s*for\s*\(  # Leading for construct
      )(?P<type>int)(?P<remainder>\s+(?P<identifier>[A-Za-z_][0-9A-Za-z]*)  # int type followed by identifier
      \s*=\s*0\s*;  # Matches '= 0;'
      \s*(?P=identifier)\s*<\s*(?P<container>[A-Za-z_][0-9A-Za-z]*)\.size\(\); # ident < container.size();
      [^)]*\).*$)""",
      re.VERBOSE)

for line in fileinput.input():
    line = line.rstrip()
    match_object = regex.match(line)
    if match_object is not None:
        line = match_object.expand('\g<start>size_t\g<remainder>')
    print line