使用XCode的REGEX搜索/替换将()更改为{}(C ++ 11初始值设定项)

时间:2014-11-20 23:32:56

标签: regex xcode search replace edit

编辑:我正在退出这个问题(通过投票结束),因为我在这里问了一个更好的问题:Use REGEX to replace X(...) with X{...}

我正在将一些代码更新到C ++ 11,它有大量的Foo()初始化程序,应由Foo {}替换。

它不像直接搜索和替换那么简单,因为嵌套括号是可能的,例如巴(瓦特( “你好”))

我正在寻找能够消除大部分努力的简单事物。 (区分何时保持()和何时切换{}的东西会非常棘手)

我注意到Xcode支持正则表达式搜索和替换。是否可以使用此机制来替换:

Foo(BLAH) 

Foo{BLAH}

哪里BLAH只需平衡括号?

然后,我可以为Foo,Bar,......中的每一个单独搜索和替换。

1 个答案:

答案 0 :(得分:3)

您面临的一般问题是"平衡括号",这对于大多数正则表达式实现来说非常困难。但是,只要您没有包含相同类型的构造函数的构造函数,并且您在单行上没有多个构造函数

替换

Foo\((.*)\)

使用

Foo{$1}

请注意,以下模式会导致问题:

Foo(Foo()) => Foo{Foo()}

Foo(), Foo() => Foo{}

正如OP在评论中指出的那样,这也引起了预期输入的问题,例如:

Object( pyob, owned ) { validate(); } => Object{ pyob, owned }; }

解决这个问题的方法是使用 lazy 量词(而不是贪婪)。使用延迟量词的问题在于它只会获得最里面的实例;你必须重复嵌套构造函数的替换。通过在它们后面添加问号,可以使量词变得懒惰。所以你将替换:

Foo\((.*?)\)

使用:

Foo{$1}

现在,如果你有这个:

Foo(Foo())

第一次替换将产生:

Foo(Foo{})

然后如果再次运行替换,您将获得:

Foo{Foo{}}