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

时间:2011-01-24 05:06:26

标签: iphone ios objective-c xcode

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

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

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

[myClass doOperationOne
[myClass doOperationTwo
[myClass doOperationThree

并将其替换为以下内容(通过附加WithOptions:[Permissions isOptionsAvailable]

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

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

6 个答案:

答案 0 :(得分:62)

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

为方法添加其他参数:

替换

[* setFoo:*]

[* setFoo:* bar:value]
你做了

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

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

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

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

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

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

换句话说,这一行:

[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保留...

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

更多例子:

不推荐使用的方法(iOS)

dismissModalViewControllerAnimated:...弃用

修复已弃用的dismissModalViewController,将其替换为空的完成块并保留动画值:

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

presentModalViewController:animated:弃用

(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(

由于Core Graphics有CGPDFDocumentRelease和类似,我必须确保启动这个词与PD一起。


<强> <击> PDAssert( PDScannerPop...(...) <击> ) ;

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

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

此处没有$ 1,因为这会再次包含PDAssert(。请注意,我已经在PDAssert之后拆分(并且正在遗漏)in);在第3个块中删除剩余的parens以移除PDAssert(。

处理最终括号

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

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

使用replace\((.*)\)会抓取replace(arg), bar),结果将为foo(newvalue(newarg)!而是使用replace\(([^\)]*)\)来抓取replace(arg)并单独留下, bar)

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

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

中心奇怪的事情与“强”和“保留”相匹配。

答案 1 :(得分:41)

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

我的查找字符串是:

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

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

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

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

答案 2 :(得分:15)

Xcode 8的注意事项

我试图在下面更新我对Xcode 8的回答,但我无法做到。 If you have the answer, please let me know.

Xcode 7

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

实施例

替换这些字符串:

  

[myClass doOperation One ];
  [myClass doOperation 两个];
  [myClass doOperation ];

使用这些字符串

  

[myClass doOperation One WithOptions:[Permissions isOptionsAvailable]];
  [myClass doOperation Two WithOptions:[Permissions isOptionsAvailable]];
  [myClass doOperation WithOptions:[权限   isOptionsAvailable]];

粗体数字显示了为什么简单的查找和替换不起作用。

设置

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

点击放大镜

enter image description here

和&#34;编辑查找选项...&#34;

enter image description here

并选择其中一个。

enter image description here

方法1 - 文本

  • 在查找

  • 中输入[myClass doOperation
  • 点击放大级并选择&#34;插入模式&#34;

enter image description here

  • 选择&#34;任何单词字符&#34;

enter image description here

  • ];添加到“查找”

enter image description here

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

enter image description here

  • 单个“全部替换”现在可以使用。

方法2 - 正则表达式

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

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

  • 使用$1$2WithOptions:[Permissions isOptionsAvailable]$3替换字符串。 $1$2$3会替换正则表达式中的括号。

enter image description here

  • 单个“全部替换”现在可以使用。

  • 有关正则表达式的更多帮助,请参阅this link

另见

答案 3 :(得分:1)

我找不到任何说明在XIN中支持正则表达式捕获和替换的东西。

你想要

\[myClass\.myMethod\sdoOperation([A-Z][a-z]+)\] 

捕获数字。虽然。这就是括号的用途。

答案 4 :(得分:1)

在当前版本的Xcode中,我相信您只能使用正则表达式进行搜索。替换不会给你这种灵活性。如果您只想以这种方式替换三种方法,我将运行搜索并替换三次。否则,我会使用awk或sed修改我在BASH中的源代码。

答案 5 :(得分:0)

Xcode 11 +

例如:

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

并替换为args: $1

您将得到如下结果

enter image description here

别忘了,使用()来包装.*,否则您将得到空的结果。