簡體   English   中英

解析Objective-C printf格式字符串?

[英]Parse Objective-C printf Format Strings?

我想獲得使用+[NSString stringWithFormat:]構建的NSString的成員范圍。 解析objective-c格式字符串的最佳方法是什么? 因為%@我不能只使用C格式的字符串解析器。 我還需要確保它支持格式排序: %1$d%2$@等。

例如,使用[NSString stringWithFormat:@"foo %2$@ bar %1$@", @"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:] ,但它也會返回一個NSArrayNSRange包含每個格式數據元素的NSRange

- 編輯 -

鑒於這個問題已經有3年了,我現在很滿意只有C語言的實現。

幾年前我對此進行了研究。 如果我理解你的問題,就沒有簡單的方法可以從C或Cocoa格式字符串的格式字符串中獲取AST。

我編寫了NSXMLElement + elementWithXMLFormat,它允許將NSXMLElements非轉義插入到帶有特殊%%%@格式代碼的格式字符串中,這需要擴展Cocoa的格式。 我的技術可能對您有所幫助:

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

我提取和NUL分隔格式代碼,傳統運行然后重新組裝。

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

您可以在我的GitHub上看到代碼的一部分進行解析。

  • 當然,它是在Swift中而不是Objective-C但我想它可以很容易地轉換為ObjC,只要你保持算法的邏輯。
  • 我的代碼不會返回范圍作為這些函數的輸出 - 只有類型 - 但typesFromFormatString函數中的代碼肯定可以訪問這些占位符的范圍,並且除了檢測到的類型之外可以完全返回它們(這很容易改變,我只是不需要那些范圍所以我沒有將它們包含在返回類型中)

(一旦你有像%d%2$@這樣的占位符的范圍,就可以很容易地推斷出字符串參數的范圍:第一個范圍將具有與第一個占位符相同的.location但是長度為替換值時,第二范圍將有.location的第二占位符+(firstValue.length-firstRange.length)的取偏移考慮在內,等)

HTH。

暫無
暫無

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

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