使用正则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]$3
replacestring。$1
,$2
和$3
replace正则expression式中的括号。
-
一个replace全部将现在工作。
-
看到这个链接更多的正则expression式的帮助。
也可以看看
- 我如何find并replaceXcode中的select?
我找不到在Xcode中支持正则expression式捕获和replace的任何内容。
你会想要的
\[myClass\.myMethod\sdoOperation([AZ][az]+)\]
捕捉号码。 虽然。 这是括号内容。
在当前版本的Xcode中,我相信你只能使用正则expression式进行search。 replace不会给你这种灵活性。 如果您只有三种方法要以这种方式replace,我会运行search并replace三次。 否则,我会使用awk或sed在BASH中修改我的源代码。