编辑:我正在退出这个问题(通过投票结束),因为我在这里问了一个更好的问题:Use REGEX to replace X(...) with X{...}
我正在将一些代码更新到C ++ 11,它有大量的Foo()初始化程序,应由Foo {}替换。
它不像直接搜索和替换那么简单,因为嵌套括号是可能的,例如巴(瓦特( “你好”))
我正在寻找能够消除大部分努力的简单事物。 (区分何时保持()和何时切换{}的东西会非常棘手)
我注意到Xcode支持正则表达式搜索和替换。是否可以使用此机制来替换:
Foo(BLAH)
与
Foo{BLAH}
哪里BLAH只需平衡括号?
然后,我可以为Foo,Bar,......中的每一个单独搜索和替换。
答案 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{}}