2014-02-13 35 views
2

我有一個小正則表達式問題(有時候我們都不要) 幾段代碼來自Objective C,但正則表達式是還是一樣,我相信。正則表達式(搜索函數(@「字符串內容」)以獲得「字符串內容」

我有兩個函數調用

NSString * CRLocalizedString(NSString *key) 
NSString * CRLocalizedArgString(NSString *key, ...) 

這些散落在我的項目定位。 現在我想找到他們。 好去的目錄,分析所有的文件,等 所有罰款那裏。 我使用的正則表達式這些文件是

而且這個作品完美,除了我的終止字符是an)。

的問題時與函數調用這樣

CRLocalizedString(@"Happy =), o so happy =D"); 
CRLocalizedArgString(@"Filter (%i)", 0.75f); 

正則表達式結束於字符串「篩選(%i」和在「快樂=)」。 這就是我的正則表達式知識結束的地方,我現在不再做什麼。 我以爲使用「);」作爲結束,但並非總是如此。

,所以我希望這裏有人知道我的東西(完成不同的事情,然後正則表達式也是允許的,當然)

親切的問候

薩恩

+1

我不認爲你需要轉義方括號內的''''。所以使用'[^)]'而不是'[^ \\]]''。 – rmaddy

+0

你說得對。使它只是更可讀=) –

回答

3

讓我們寫你的第一個正則表達式沒有額外水平章C逃脫:

CRLocalizedString\(@\"[^)]+\"\) 

你不必逃避一個正則表達式一個",讓我們擺脫那些內線的ra反斜槓:

CRLocalizedString\(@"[^)]+"\) 

所以,你想匹配一個帶引號的字符串使用"[^)]+"。但是這不符合每個引用的字符串。

什麼是引用字符串?這是一個",隨後是任意數量的字符串原子,然後是另一個"。什麼是字符串原子?它是任何字符,除了"\, a \後跟任何字符。因此,這裏是一個帶引號的字符串正則表達式:

"([^"\\]|\\.)*" 

堅持這回你的第一個正則表達式,我們得到這樣的:

CRLocalizedString\(@"([^"\\]|\\.)*"\) 

Here's a link to a regex tester demonstrating that regex. 在一個Objective-C字符串字面引用它給了我們這樣的:

@"CRLocalizedString\\(@\"([^\"\\\\]|\\\\.)*\"\\)" 

這是不可能寫出一個正則表達式在一般情況下匹配調用CRLocalizedArgString,因爲這樣的電話可以採取阿爾將表達式作爲參數傳遞,正則表達式不能匹配任意表達式(因爲它們可以包含嵌套括號的任意級別,而正則表達式無法匹配)。

你可以只希望有在參數列表中沒有括號,並使用這個表達式:

CRLocalizedArgString\(@"([^"\\]|\\.)*"[^)]*\) 

Here's a link to a regex tester demonstrating that regex. 在一個Objective-C字符串字面引用它給了我們這樣的:

@"CRLocalizedArgString\\(@\"([^\"\\\\]|\\\\.)*\"[^)]*\\)" 
+0

這很好。非常感謝你 –

相關問題