[英]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,因此每次調用都必須更新。
更多例子:
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 中更容易做到這一點。 您根本不需要使用正則表達式(但如果您仍然想要,可以使用)。
替換這些字符串:
[myClass doOperation一];
[myClass doOperation二];
[myClass doOperation三];
用這些字符串
[myClass doOperation One WithOptions:[Permissions isOptionsAvailable]];
[myClass doOperation兩個WithOptions:[Permissions isOptionsAvailable]];
[myClass doOperation三WithOptions:[Permissions isOptionsAvailable]];
粗體數字顯示了為什么簡單的查找和替換不起作用。
有兩種方法可以進行查找和替換:文本和正則表達式
點擊放大鏡
和“編輯查找選項...”
並選擇其中之一。
在查找中輸入[myClass doOperation
單擊放大類並選擇“插入圖案”
];
尋找WithOptions:[Permissions isOptionsAvailable]];
最后一部分。確保按照上述設置中的說明選擇正則表達式。
使用(\\[myClass doOperation)(.*)(\\];)
作為正則表達式
使用$1$2WithOptions:[Permissions isOptionsAvailable]$3
作為替換字符串。 $1
、 $2
和$3
替換了正則表達式中的括號。
單個替換全部現在將起作用。
有關正則表達式的更多幫助,請參閱此鏈接。
我找不到任何說明在 Xcode 中支持正則表達式捕獲和替換的內容。
你會想要
\[myClass\.myMethod\sdoOperation([A-Z][a-z]+)\]
來捕捉號碼。 盡管。 這就是括號的用途。
在當前版本的 Xcode 中,我相信您只能使用正則表達式進行搜索。 替換不會給你那種靈活性。 如果您只想以這種方式替換三種方法,我會運行搜索和替換三遍。 否則,我將使用 awk 或 sed 在 BASH 中修改我的源代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.