簡體   English   中英

使用正則表達式在 Xcode 中查找/替換

[英]Find/Replace in Xcode using Regular Expression

我在班級的幾個地方有以下函數調用。

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

如何使用單個正則表達式查找/替換來執行此操作?

注意:Xcode 6 中的行為發生了變化。 \\123 語法被替換為 $123。 另請注意,現在可以在 reg exp 中匹配換行符,因此請務必在 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。

總是手動執行此操作,但在這種情況下,我添加了一個可選的“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(

由於核芯顯卡具有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 東西匹配“強”和“保留”。

不知何故,我通過參考帖子找到了答案(這足以滿足我的需要): http : //www.cocoabuilder.com/archive/xcode/273123-how-to-use-regular-expressions-in -xcode-find-replace.html和試錯法。

我的查找字符串是:

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

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

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

如果有比這更好的方法,請發布..

Xcode 8 的注意事項

我試圖在下面為 Xcode 8 更新我的答案,但我做不到。 如果你有答案,請告訴我。

Xcode 7

除非您已經是正則表達式天才,否則現在在 Xcode 中更容易做到這一點。 您根本不需要使用正則表達式(但如果您仍然想要,可以使用)。

例子

替換這些字符串:

[myClass doOperation];
[myClass doOperation];
[myClass doOperation];

用這些字符串

[myClass doOperation One WithOptions:[Permissions isOptionsAvailable]];
[myClass doOperation兩個WithOptions:[Permissions isOptionsAvailable]];
[myClass doOperationWithOptions:[Permissions isOptionsAvailable]];

粗體數字顯示了為什么簡單的查找和替換不起作用。

設置

有兩種方法可以進行查找和替換:文本正則表達式

點擊放大鏡

在此處輸入圖片說明

和“編輯查找選項...”

在此處輸入圖片說明

並選擇其中之一。

在此處輸入圖片說明

方法 1 - 文本

  • 在查找中輸入[myClass doOperation

  • 單擊放大類並選擇“插入圖案”

在此處輸入圖片說明

  • 選擇“任意單詞字符”

在此處輸入圖片說明

  • 添加]; 尋找

在此處輸入圖片說明

  • 重復替換字符串但使用WithOptions:[Permissions isOptionsAvailable]]; 最后一部分。

在此處輸入圖片說明

  • 單個替換全部現在將起作用。

方法 2 - 正則表達式

  • 確保按照上述設置中的說明選擇正則表達式。

  • 使用(\\[myClass doOperation)(.*)(\\];)作為正則表達式

  • 使用$1$2WithOptions:[Permissions isOptionsAvailable]$3作為替換字符串。 $1$2$3替換了正則表達式中的括號。

在此處輸入圖片說明

  • 單個替換全部現在將起作用。

  • 有關正則表達式的更多幫助,請參閱此鏈接

也可以看看

我找不到任何說明在 Xcode 中支持正則表達式捕獲和替換的內容。

你會想要

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

來捕捉號碼。 盡管。 這就是括號的用途。

在當前版本的 Xcode 中,我相信您只能使用正則表達式進行搜索。 替換不會給你那種靈活性。 如果您只想以這種方式替換三種方法,我會運行搜索和替換三遍。 否則,我將使用 awk 或 sed 在 BASH 中修改我的源代碼。

Xcode 11+ 上

例如:

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

並替換為args: $1

你會得到如下結果

在此處輸入圖片說明

不要忘記使用()包裝.* ,否則您將得到一個空結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM