使用正则表达式在Xcode中查找/替换

Emp*_*ack 43 iphone xcode objective-c ios

我在班上的几个地方都有以下函数调用.

[myClass doOperationOne];
[myClass doOperationTwo];
[myClass doOperationThree];
Run Code Online (Sandbox Code Playgroud)

在这些行中,我想搜索以下内容,

[myClass doOperationOne
[myClass doOperationTwo
[myClass doOperationThree
Run Code Online (Sandbox Code Playgroud)

并用以下内容替换它们(通过附加WithOptions:[Permissions isOptionsAvailable])

[myClass doOperationOneWithOptions:[Permissions isOptionsAvailable]];
[myClass doOperationTwoWithOptions:[Permissions isOptionsAvailable]];
[myClass doOperationThreeWithOptions:[Permissions isOptionsAvailable]];
Run Code Online (Sandbox Code Playgroud)

如何使用单个正则表达式查找/替换来执行此操作?

Kal*_*lle 63

注意:Xcode 6中的行为已更改.\ 123语法已替换为$ 123.还要注意,现在可以在reg exps中匹配换行符,所以一定要在Replace-Alling之前略过

在方法中添加其他参数:

取代

[* setFoo:*]
Run Code Online (Sandbox Code Playgroud)

[* setFoo:* bar:value]
Run Code Online (Sandbox Code Playgroud)

你做

(setFoo:)(.*)(\])
$1$2 bar:value]
Run Code Online (Sandbox Code Playgroud)

(分别搜索字符串和替换字符串).

或者,如果在Xcode 5或更早版本

(setFoo:)(.*)(\])
\1\2 bar:value]
Run Code Online (Sandbox Code Playgroud)

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

注意:此处所写的所有内容均适用于NSString/ NSMutableString使用时的字符串替换方法NSRegularExpressionSearch!

换句话说,这一行:

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

将所有"[...]\n"序列(例如"[...\n..."单独留下!)转换为使用$ 1 "\n///\n\n[...]\n"保留....

总是这样做,但在这种情况下,我添加了一个可选的'animate:'标志,到目前为止的默认值是YES,但我想要NO,所以每次调用都必须更新.

更多例子:

不推荐使用的方法(iOS)

dismissModalViewControllerAnimated:... 弃用

要修复已弃用的dismissModalViewController替换它,请使用空的完成块并保留动画值:

(dismissModalViewControllerAnimated:)(.*)(\])
dismissViewControllerAnimated:$2 completion:nil]
Run Code Online (Sandbox Code Playgroud)

presentModalViewController:animated: 弃用

(presentModalViewController:)(.*)( animated:)(.*)(\])
presentViewController:$2$3$4 completion:nil]
Run Code Online (Sandbox Code Playgroud)

PD ...发布→PD ...销毁

我最近写了AC库一堆的前缀的文件PD,我用创建/释放作为的malloc /免费的关键字,这是我很遗憾,因为它可能让人们认为保留计数保持,所以我想重新命名PD<anything>Release(PD<anything>Destroy(.

([\n\r ])(PD)(.*)Release\(
$1$2$3Destroy(
Run Code Online (Sandbox Code Playgroud)

由于核芯显卡具有CGPDFDocumentRelease相似,我必须确保这个词开始与PD为好.


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

我愚蠢地把断言放在功能代码周围,当它们变成空的时候!#ifdef DEBUG.幸运的是,我知道所有这些都是从PDAssert开始的(PDScannerPop ....并以#结尾);

(PDAssert\()(PDScannerPop)(.*)(\);)
$2$3;
Run Code Online (Sandbox Code Playgroud)

这里没有$ 1,因为那将包括PDAssert(再次.请注意,我已经在PDAssert之后拆分(并且正在遗漏)in); 在第3个块中,删除多余的parens去除PDAssert(.

处理最后的括号

您可以匹配除")"之外的所有内容来处理过度贪婪的正则表达式替换.例:

foo(replace(arg), bar)
foo(newvalue(newarg), bar)
Run Code Online (Sandbox Code Playgroud)

使用replace\((.*)\)将抓取replace(arg), bar)和结果将是foo(newvalue(newarg)!而是使用replace\(([^\)]*)\)哪个会抓住replace(arg), bar)独自离开.

将一堆NSString属性从使用retain和/或strong(以及其他任何内容)转换为使用副本

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

中心奇怪的事情与"强"和"保留"相匹配.


Emp*_*ack 42

不知何故,我通过引用帖子找到了答案(这对我的需要来说已足够了):http://www.cocoabuilder.com/archive/xcode/273123-how-to-use-regular-expressions-in -xcode-find-replace.html,以及试错法.

我的查找字符串是:

(\[myClass.myMethod )(.*)(\];)
Run Code Online (Sandbox Code Playgroud)

而且,我的替换字符串是:

\1\2WithOptions:[Permissions isOptionsAvailable]\3
Run Code Online (Sandbox Code Playgroud)

如果有比这更好的方法,请发布..

  • 请注意(请参阅@ Kalle的回答)此行为在Xcode 6中更改为使用$ 1,$ 2而不是\ 1,\ 2 (18认同)

Sur*_*gch 17

Xcode 8的注意事项

我试图更新下面的Xcode 8的答案,但我做不到.如果您有答案,请告诉我.

Xcode 7

除非你已经是正则表达天才,否则现在在Xcode中更容易做到.您根本不需要使用正则表达式(但如果您仍想使用,则可以使用).

替换这些字符串:

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

用这些字符串

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

粗体数字显示为什么普通的查找和替换不起作用.

建立

您可以通过两种方式进行查找和替换:文本正则表达式

单击放大镜

在此输入图像描述

和"编辑查找选项..."

在此输入图像描述

并选择其中之一.

在此输入图像描述

方法1 - 文本

  • 输入[myClass doOperation查找

  • 单击放大级并选择"插入模式"

在此输入图像描述

  • 选择"任何单词字符"

在此输入图像描述

  • 添加];到查找

在此输入图像描述

  • 重复替换字符串,但WithOptions:[Permissions isOptionsAvailable]];用于最后一部分.

在此输入图像描述

  • 单个替换全部将立即生效.

方法2 - 正则表达式

  • 确保按照上面的设置中的说明选择正则表达式.

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

  • 使用$1$2WithOptions:[Permissions isOptionsAvailable]$3了替换字符串.的$1,$2$3替换正则表达式的括号内.

在此输入图像描述

  • 单个替换全部将立即生效.

  • 有关正则表达式的更多帮助,请参阅此链接.

也可以看看


小智 7

在Xcode 11+

例如:

当您使用view(.*)Appear查找所有 viewDidAppear 或 viewWillAppear时

并替换为args: $1

您将得到如下结果

在此输入图像描述

不要忘记使用()来包装.*,否则你会得到一个空结果。