使用iOS NSRegularExpression进行Ruby样式的字符串插值
我正在尝试为我的应用中的模型生成HTML输出。 这将有效地通过模型中的相关值填充HTML文件中的各个位置。 我原本只是将HTML模板作为格式化字符串,但如果稍后在布局或任何事情上发生任何变化,这将使得将值的顺序与它们在模板中出现的顺序相匹配变得非常麻烦和繁琐。 。
相反,我正在尝试做的是运行一种Ruby样式的文件字符串插值。 无论我想从模型中获取值,我都会将我想要的模型属性的名称设置为: #{key.path}
。
然后,我试图使用以下正则表达式来处理它: @"#{([^}]+)}"
。
要处理这个,我使用以下设置:
NSString *processedTemplate = [regex stringByReplacingMatchesInString:template options:0 range:NSMakeRange(0, template.length) withTemplate:[self valueForKeyPath:@"$1"]];
但是,当我运行它时,我收到错误:
*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[ valueForUndefinedKey:]: this class is not key value coding-compliant for the key $1.'
我期望的是我可以使用正则表达式匹配并使用它来获取我的模型中符合键值编码的值。 但是,这显然不能像我使用它那样工作。
另外,我认为我正在使用这个,但是当我运行它来替换withTemplate:@"$1"
我得到了NULL。 所以,我尝试使用:
NSString *processedTemplate = [template stringByReplacingOccurrencesOfString:@"#{([^}]+)}" withString:@"$1" options:NSRegularExpressionSearch range:NSMakeRange(0, template.length)];
但是,当我运行它时,它不会替换为()
的部分。 所以,无论如何,我都没有做对。 任何人有任何指针/解决方案?
更新
因此看起来像withString:
参数将解释@"$1"
就像正则表达式匹配数据找到的那样。 是否有另一种方法来检索匹配数据,以便它可以传递给valueForKeyPath:
这样的方法valueForKeyPath:
?
更新
在我看来,我不知道为什么,但我的正则表达式#{([^}]+)}
与我期望的不匹配。 我提出的任何其他正则表达式模拟器似乎都很好,但它在iOS上的obj-c中不匹配。 在字符集#{}
上有逃逸的东西吗?
在你的第一个例子中, self
是什么样的对象? 你有没有覆盖valueForKeyPath:
方法-valueForKeyPath:
是为NSObject定义的,用于返回基于KVC密钥路径的值。 代码
obj = [anotherObj valueForKeyPath: @"foo.bar.baz"];
首先将foo
发送到anotherObj
,然后将bar
发送到结果,然后将baz
发送到结果并返回最终结果。
从本质上讲,运行时抱怨你没有一个叫做-$1
的方法。
顺便说一句,在Objective-C参数中方法是在方法本身之前进行评估的,所以
[self valueForKeyPath:@"$1"]
在 stringByReplacingMatchesInString:
之前进行求stringByReplacingMatchesInString:
$1
对valueForKeyPath:
没有任何特殊意义valueForKeyPath:
。