将模式从字符串后移到之前

时间:2012-07-11 17:02:08

标签: regex scripting grep

我有一个大型代码库可以进行排序,因此我希望尽可能自动化该过程。我已经设法清除了与我的任务相关的所有行,但我想自动完成任务本身。

我要做的是将所有尾随增量更改为前导增量,如下例所示:

i++;

变为

++i;

我认为正在使用正则表达式,而且我对那些正在生锈。另外,哪种语言最适合编写脚本?我目前正在使用Windows 7 x64,但与平台无关的解决方案很酷。另外,如果你能指出我可以了解更多关于这类问题的具体资源,那就太棒了。

3 个答案:

答案 0 :(得分:2)

这样做......

s/([a-z0-9]+)\+\+/++$1/g

但它是邪恶的,会破坏像:

print "+++++++++Some heading++++++++++++\n";

更不用说i ++和++ i实际上做了不同的事情,你需要使用i ++。

我的建议(假设你真的有理由认为i ++在许多情况下是错误的):

rgrep ++ * > fixme.txt

然后在您喜欢的文本编辑器中打开fixme.txt,并手动调查每个事件,并在文本文件中将其删除。

答案 1 :(得分:0)

首先,请参阅[13.15] Which is more efficient: i++ or ++i?对于像int这样的原始类型,效率没有提高。但是,假设您知道这一点,解决方案取决于您将使用的工具。如果您使用的是Perl,即

perl -pi -w -e 's/search/replace/g;' *.cc

...然后这个正则表达式会起作用:

s/\b([a-zA-Z]\w*)\+\+/\+\+$1/g

我同意@Flimzy,虽然这看起来非常危险,不应该自动化。

答案 2 :(得分:0)

我之前已经完成了项目。如果您在存储库中拥有代码库,是个好主意。方便的是,它允许您运行更改,然后将项目差异转储到您喜欢的文本编辑器中,以查看所有更改。快速查看将让您查看是否有任何意外的编辑,您可以修复它。

除了使用正则表达式Flimzy建议外,另一个选择是构建一个小的词法分析器/解析器来适应这个用例。您不是在寻找一个完整的编译器,只是具有足够的注释和引号状态的东西。

Lex&Yacc 2nd. Ed.有一个用于读取c代码的示例词法分析器,它非常小,展示了此工具链的强大功能。我相信这些例子也可以在其他地方找到。如果它看起来很复杂,你可以用一个简单的状态机和用perl脚本构建的正则表达式系统伪造它。

最后,您还可以查看ply,如果您更愿意使用python。