我在班上的几个地方都有以下函数调用。
[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]];
如何使用单个正则表达式查找/替换来执行此操作?
答案 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,所以每次调用都必须更新。
更多例子:
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的回答,但我无法做到。 If you have the answer, please let me know.
除非你已经是正则表达天才,否则现在在Xcode中更容易做到。您根本不需要使用正则表达式(但如果您仍想这样做,则可以。)
替换这些字符串:
[myClass doOperation One ];
[myClass doOperation 两个];
[myClass doOperation 三];
使用这些字符串
[myClass doOperation One WithOptions:[Permissions isOptionsAvailable]];
[myClass doOperation Two WithOptions:[Permissions isOptionsAvailable]];
[myClass doOperation 三 WithOptions:[权限 isOptionsAvailable]];
粗体数字显示了为什么简单的查找和替换不起作用。
您可以通过两种方式查找和替换:文字和正则表达式
点击放大镜
和&#34;编辑查找选项...&#34;
并选择其中一个。
在查找
[myClass doOperation
点击放大级并选择&#34;插入模式&#34;
];
添加到“查找”WithOptions:[Permissions isOptionsAvailable]];
。确保按照上面的设置中的说明选择正则表达式。
将(\[myClass doOperation)(.*)(\];)
用于正则表达式
使用$1$2WithOptions:[Permissions isOptionsAvailable]$3
替换字符串。 $1
,$2
和$3
会替换正则表达式中的括号。
单个“全部替换”现在可以使用。
有关正则表达式的更多帮助,请参阅this link。
答案 3 :(得分:1)
我找不到任何说明在XIN中支持正则表达式捕获和替换的东西。
你想要
\[myClass\.myMethod\sdoOperation([A-Z][a-z]+)\]
捕获数字。虽然。这就是括号的用途。
答案 4 :(得分:1)
在当前版本的Xcode中,我相信您只能使用正则表达式进行搜索。替换不会给你这种灵活性。如果您只想以这种方式替换三种方法,我将运行搜索并替换三次。否则,我会使用awk或sed修改我在BASH中的源代码。
答案 5 :(得分:0)