2013-01-07 149 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。