2013-01-07 54 views
10

我想與+[NSString stringWithFormat:]建立了一個NSString內成員的範圍。什麼是解析objective-c格式字符串的最佳方法?由於%@,我不能只使用C格式的字符串解析器。我還需要確保它支持的格式排序:%1$d%[email protected]解析Objective-C printf格式字符串?

例如,與[NSString stringWithFormat:@"foo %[email protected] bar %[email protected]", @"Heath", @"Borders"]內置的字符串,我會非常喜歡以下NSArray@[NSMakeRange(15, 5), NSMakeRange(4, 6)]。第一陣列對象對應于格式字符串中的第一個數據元素,所述第二陣列對象到第二數據元素等

在這種情況下,該API將看起來像+ (NSString *) stringWithFormatRanges:(NSArray **)outFormatRanges withFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);這將返回一個NSString就像+[NSString stringWithFormat:] ,但它也會返回NSArray與各格式數據元素的NSRange

- 編輯 -

考慮到這個問題,今年3歲,我很高興在這一點僅C-實現。

+0

解析你的具體要求是什麼......請解釋一下。 –

+3

你是什麼意思「成員範圍?」你是否想要解析「%@」,「%1 $ d」和「%2 $ @」這樣的子字符串? – trudyscousin

+0

我想你會首先提取單個格式的項目,也許用RE,然後編寫代碼來檢查它們並對它們進行分類。 –

回答

5

我在幾年前看着這一點。如果我理解你的問題,那麼從C或Cocoa格式字符串的格式字符串中獲取AST沒有簡單的方法。

我寫了NSXMLElement + elementWithXMLFormat,它允許NSXMLElements無格式地插入格式化字符串,並使用特殊的%%%@格式代碼,這需要擴展Cocoa的格式。我的技術可以對你有所幫助:

https://github.com/rentzsch/nsxmlelement-elementwithxmlformat/blob/937b54b2a830a8fbbd72d6bc5e48bafd495ddcbd/NSXMLElement%2BelementWithXMLFormat.m#L41

我提取和NUL-劃剛剛格式代碼,通過傳統的運行它,然後重新組裝。

+0

謝謝!我今晚會看這個。它看起來很有希望。 –

3

我寫了一個解析器對於那些在斯威夫特(這樣我就可以檢測其預計類型調用stringWithFormat:與這些字符串時要給出Localizable.strings這些佔位符和提取物)對我的工具SwiftGen

你可以看到部分代碼進行解析there on my GitHub

  • 當然,它是在Swift中,而不是Objective-C,但我想它很容易翻譯成ObjC,只要你保持算法的邏輯。
  • 我的代碼不會返回範圍既可以作爲這些功能輸出 - 只有類型 - 但代碼中typesFromFormatString功能絕對有訪問這些佔位符的範圍和除檢測到的類型可能完全恢復它們(這是一個簡單的變化,我只是沒有需要的範圍,所以我不包括他們在返回類型)

(一旦你擁有像%d%[email protected]佔位符的範圍,這將是很容易推導出字符串參數的範圍:第一個範圍與第一個佔位符具有相同的.location,但替換值的長度相同,第二個範圍將具有.location第二個佔位符+(firstValue.length-firstRange.length)將偏移量考慮進去,等等)

HTH。