【问题标题】:Find/Replace in Xcode using Regular Expression使用正则表达式在 Xcode 中查找/替换
【发布时间】:2011-01-24 05:06:25
【问题描述】:

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

[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]];

如何使用单个正则表达式查找/替换来做到这一点?

【问题讨论】:

    标签: iphone ios objective-c xcode


    【解决方案1】:

    注意: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 或更早版本上,则交换)

    注意:这里写的所有内容都适用于使用NSRegularExpressionSearch时NSString/NSMutableString中的字符串替换方法!

    换句话说,这一行:

    [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...销毁

    我最近写了一个 c 库,其中包含一堆前缀为 PD 的文件,我使用 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( 并且在 ); 中省略了 ) 之后进行了拆分。在第三块中,它从删除 PDAssert(.

    中删除了多余的括号

    处理结束括号

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

    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
    

    中间那个奇怪的 sr te rt 东西同时匹配“强”和“保留”。

    【讨论】:

    • 字符串替换似乎不适用于单个文件中的查找/替换。
    • 我一直在使用它。你的搜索和替换字符串是什么?
    【解决方案2】:

    通过引用帖子:http://www.cocoabuilder.com/archive/xcode/273123-how-to-use-regular-expressions-in-xcode-find-replace.html,以及反复试验的方法,我设法找到了答案(这足以满足我的需要)。

    我的查找字符串是:

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

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

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

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

    【讨论】:

    • 这是我对正则表达式的唯一疑虑。替换行为不是那么标准。太好了,你找到了这个。
    • 请注意(请参阅@Kalle 的回答)此行为在 Xcode 6 中更改为使用 $1, $2 而不是 \1, \2
    【解决方案3】:

    Xcode 8 的注意事项

    我试图在下面为 Xcode 8 更新我的答案,但我做不到。 If you have the answer, please let me know.

    Xcode 7

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

    示例

    替换这些字符串:

    [myClass doOperation一个];
    [myClass doOperation二];
    [myClass doOperation三];

    使用这些字符串

    [myClass doOperationOneWithOptions:[Permissions isOptionsAvailable]];
    [myClass doOperationTwoWithOptions:[Permissions isOptionsAvailable]];
    [myClass doOperation三个WithOptions:[权限 isOptionsAvailable]];

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

    设置

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

    点击放大镜

    和“编辑查找选项...”

    然后选择其中之一。

    方法 1 - 文本

    • 在查找中输入[myClass doOperation

    • 点击放大类并选择“插入图案”

    • 选择“任何单词字符”

    • 添加]; 到查找

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

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

    方法 2 - 正则表达式

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

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

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

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

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

    另见

    【讨论】:

      【解决方案4】:

      关于 Xcode 11+

      例如:

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

      并替换为args: $1

      你会得到如下结果

      别忘了使用()包裹.*,否则你会得到一个空的结果。

      【讨论】:

        【解决方案5】:

        我找不到任何说明 Xcode 支持正则表达式捕获和替换的内容。

        你会想要的

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

        捕捉数字。尽管。这就是括号的用途。

        【讨论】:

          【解决方案6】:

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

          【讨论】:

          • 在工作区中查找和替换以及在单个文件中查找和替换都支持正则表达式。将光标放在搜索字段中的放大镜上,点击下拉箭头并选择“显示查找选项”。不确定他们使用哪个引擎,您会认为是基于 ICU 的东西,例如 NSPredicate,但它在识别 PCRE 的 \n 替换模式(这是 BBEdit 使用的)时没有问题。唯一的问题是它拒绝捕获或替换回车或换行符 (\r \n)。我找不到任何文档。
          猜你喜欢
          • 2012-06-06
          • 2012-01-30
          • 2023-03-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-18
          • 1970-01-01
          相关资源
          最近更新 更多