【发布时间】:2013-01-07 18:13:48
【问题描述】:
我想获取使用+[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:] 一样,但它也会返回一个NSArray,每个格式数据元素都有NSRanges。
-- 编辑--
鉴于这个问题已经存在 3 年了,我很乐意在这一点上使用纯 C 实现。
【问题讨论】:
-
解析方式,您的具体要求是什么...请解释一下。
-
“成员范围”是什么意思?您是说要解析“%@”、“%1$d”和“%2$@”等子字符串吗?
-
我认为您应该首先提取单个格式项,也许使用 RE,然后编写代码来检查它们并对其进行分类。
-
尽管没有记录,C
printf()的%nspecifier 在 Objective-C 中是否按预期工作?如果是这样,这就像在stringWithFormat周围编写一个包装器一样简单,该包装器在其他说明符之前和之后立即注入%n,调用格式化程序,然后将字节计数后处理为您需要的任何形式。 -
@HeathBorders 好吧,C 标准对
printf()的描述使用一组不相交的字符作为转换说明符以及介于两者之间的字符(标志、字段宽度、精度、长度修饰符)。困扰我的是%@转换说明符可能不受普通printf()支持,但%n可能不受stringWithFormat支持。
标签: objective-c c printf