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



我有一个非常古老的大型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])

我使用的是visualstudio2008。我正在寻找这个问题最正确的解决方案。非常感谢。

查找内容的Regex:for[:bn]*([:bn]*int[:bn]+{:i}[:bn]*=[:bn]*0[:bn]*;[:bn]*{:i}[:bn]*<[:bn]*{:i}.size[:bn]*([:bn]*);[:bn]*

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

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

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

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

#!/usr/bin/env python
import fileinput
import sys
import re
regex = re.compile(
    r"""(?P<start>^s*fors*(  # 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*0s*;  # 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_tg<remainder>')
    print line

最新更新