使用正则expression式在Xcode中查找/replace

我在我的课上的几个地方有以下函数调用。

[myClass doOperationOne]; [myClass doOperationTwo]; [myClass doOperationThree]; 

在这些方面,我想search以下内容,

 [myClass doOperationOne [myClass doOperationTwo [myClass doOperationThree 

并用以下replace它们(通过附加WithOptions:[Permissions isOptionsAvailable]

 [myClass doOperationOneWithOptions:[Permissions isOptionsAvailable]]; [myClass doOperationTwoWithOptions:[Permissions isOptionsAvailable]]; [myClass doOperationThreeWithOptions:[Permissions isOptionsAvailable]]; 

我怎样才能做到这一点使用单个正则expression式查找/replace?

注:在Xcode 6中更改的行为。\ 123语法被replace为$ 123。 另外要注意的是换行符现在可以在reg exps中匹配,所以一定要在Replace-Alling之前浏览一下

给方法添加一个额外的参数:

取代

 [* setFoo:*] 

 [* setFoo:* bar:value] 

你做

 (setFoo:)(.*)(\]) $1$2 bar:value] 

(分别searchstring和replacestring)。

或者,如果在Xcode 5或更旧版本上

 (setFoo:)(.*)(\]) \1\2 bar:value] 

(下面使用新的语法;如果在Xcode 5或更旧版本上,则使用交换)

注意:当使用NSRegularExpressionSearch时,这里写的所有内容都适用于NSString / NSMutableString的stringreplace方法!

换句话说,这一行:

 [input replaceOccurrencesOfString:@"\n\\[([^\\]^\n]*)\\]\n" withString:@"\n///\n\n[$1]\n" options:NSRegularExpressionSearch range:(NSRange){0,input.length}]; 

会将所有"[...]\n"序列(例如,离开"[...\n..."单独!)转换为"\n///\n\n[...]\n" ,保存...使用$ 1。

总是这样做,但在这种情况下,我添加了一个可选的'animate:'标志,并且此时默认为YES,但是我想要NO,所以每个调用都必须更新。

更多例子:

已过时的方法(iOS)

dismissModalViewControllerAnimated:...弃用

要修复废弃的dismissModalViewController将其replace为空的完成块并保留animation值:

 (dismissModalViewControllerAnimated:)(.*)(\]) dismissViewControllerAnimated:$2 completion:nil] 

presentModalViewController:animated: deprecation

 (presentModalViewController:)(.*)( animated:)(.*)(\]) presentViewController:$2$3$4 completion:nil] 

PD …释放→PD …摧毁

我最近用一堆带有前缀PD的文件编写了一个ac库,而我用create / release作为malloc / free关键字,这让我感到遗憾,因为它可能会让人觉得保留计数是保留的,所以我想重命名PD<anything>Release(PD<anything>Destroy(

 ([\n\r ])(PD)(.*)Release\( $1$2$3Destroy( 

由于核心graphics有CGPDFDocumentRelease和类似的,我不得不确保单词开始与PD。


PDAssert( PDScannerPop...(...) ) ;

我愚蠢地把断言放在function代码周围,当#ifdef DEBUG变成空的时候。 幸运的是,我知道所有这些开始与PDAssert(PDScannerPop ….并以…结束);。

 (PDAssert\()(PDScannerPop)(.*)(\);) $2$3; 

在这里没有1美元,因为这将包括PDAssert(再次注意,我已经分配了PDAssert(并且正在离开)in)。 在删除多余的parens从删除PDAssert(。

处理结束括号

你可以匹配除“”之外的所有内容)来处理过度贪婪的正则expression式replace。 例:

 foo(replace(arg), bar) foo(newvalue(newarg), bar) 

使用replace\((.*)\)将抓住replace(arg), bar)和结果将是foo(newvalue(newarg) !相反使用replace\(([^\)]*)\) replace(arg)和离开, bar)独自一人。

转换一堆NSString属性使用保留和/或强(和其他)使用副本

 @property \(([^\)]*)[sr][te][rt][oa][ni][gn]([^\)]*)\)(.*)NSString(.*) @property ($1copy$2)$3NSString$4 

中心怪异的东西匹配“强”和“保留”。

不知何故,我已经设法find答案(这是足够的,我需要在这里)通过参考文章: http : //www.cocoabuilder.com/archive/xcode/273123-how-use-regular-expressions-in -xcode-find-replace.html和试错法。

我的查找string是:

 (\[myClass.myMethod )(.*)(\];) 

而且,我的replacestring是:

 \1\2WithOptions:[Permissions isOptionsAvailable]\3 

如果有比这更好的方式请发布。

注意Xcode 8

我试图更新我的答案下面的Xcode 8,但我做不到。 如果你有答案,请让我知道。

Xcode 7

除非你已经是一个正则expression式的天才,现在在Xcode中做起来更容易。 你根本不需要使用正则expression式(但是如果你还想的话,你也可以)。

replace这些string:

[myClass doOperation One ];
[myClass doOperation Two ];
[myClass doOperation Three ];

与这些string

[myClass doOperation One WithOptions:[Permissions isOptionsAvailable]];
[myClass doOperation Two WithOptions:[Permissions isOptionsAvailable]];
[myClass doOperation Three WithOptions:[Permissions isOptionsAvailable]];

粗体数字显示为什么一个简单的查找和replace不起作用。

build立

有两种方法可以查找和replace: 文本正则expression式

点击放大镜

在这里输入图像说明

和“编辑查找选项…”

在这里输入图像说明

并select其中之一。

在这里输入图像说明

方法1 – 文本

  • 在Find中input[myClass doOperation

  • 点击放大class,select“插入模式”

在这里输入图像说明

  • select“任何字符”

在这里输入图像说明

  • 添加]; find

在这里输入图像说明

  • 重复replacestring,但使用WithOptions:[Permissions isOptionsAvailable]]; 为最后一部分。

在这里输入图像说明

  • 一个replace全部将现在工作。

方法2 – 正则expression式

  • 确保按照上面的设置中所述select正则expression式。

  • 对正则expression式使用(\[myClass doOperation)(.*)(\];)

  • 使用$1$2WithOptions:[Permissions isOptionsAvailable]$3replacestring。 $1$2$3replace正则expression式中的括号。

在这里输入图像说明

  • 一个replace全部将现在工作。

  • 看到这个链接更多的正则expression式的帮助。

也可以看看

  • 我如何find并replaceXcode中的select?

我找不到在Xcode中支持正则expression式捕获和replace的任何内容。

你会想要的

 \[myClass\.myMethod\sdoOperation([AZ][az]+)\] 

捕捉号码。 虽然。 这是括号内容。

在当前版本的Xcode中,我相信你只能使用正则expression式进行search。 replace不会给你这种灵活性。 如果您只有三种方法要以这种方式replace,我会运行search并replace三次。 否则,我会使用awk或sed在BASH中修改我的源代码。