Initial Googling表示在Objective-C Cocoa应用程序中没有内置的正则表达式。
所以有四个问题:
这是真的吗?
你在开玩笑吗?
好的,那么你推荐一个不错的开源库吗?
有什么方法可以在不导入库的情况下获得足够接近,可能使用NSScanner类?
答案 0 :(得分:141)
我注意到,从iOS 4.0开始,Apple提供NSRegularExpression class。此外,从10.7开始,该课程可用under OS X。
答案 1 :(得分:42)
RegExKitLite不需要任何库,只需将.m和.h添加到项目中。
(我对RegExKitLite的投诉是它通过类别扩展NSString,但它也可以被视为一个功能。它还使用操作系统附带的非公共ICU库,Apple不推荐这样做。)
答案 2 :(得分:19)
答案 3 :(得分:11)
您可以使用POSIX Regular Expressions库(Yay适用于POSIX兼容的操作系统)。尝试
man 3 regex
答案 4 :(得分:8)
我用来解决REGEX和JSON解析问题的廉价和肮脏的黑客解决方案是创建一个UIWebView对象并注入Javascript函数来进行解析。然后javascript函数返回我关心的值(或值列表)的字符串。实际上,您可以存储为特定任务定制的小型库函数集,然后根据需要调用它们。
我不知道这种技术是否会扩展到大量的重复解析请求,但对于快速的事务处理,它可以完成工作,而不依赖于您可能不理解的任何额外的外部资源或代码。
答案 5 :(得分:6)
我喜欢使用PCRE的AGRegex框架,如果你习惯了PCRE语法,那就很方便了。该框架的最佳版本是Colloquy IRC客户端中的最佳版本,因为它已升级为使用PCRE 6.7:
http://colloquy.info/project/browser/trunk/Frameworks/AGRegex
它非常轻巧,远远超过RegExKit(虽然当然不具备这种能力)。
答案 6 :(得分:6)
NSRegularExpression
可用。
答案 7 :(得分:4)
在我搜索这个主题的过程中,我遇到了CocoaOniguruma,它使用Oniguruma,Ruby1.9和PHP5背后的正则表达式引擎。与现有的OregKit(日语)相比,它似乎有点新鲜。不确定这些是如何与其他绑定叠加的。
答案 8 :(得分:4)
谷歌搜索,发现这个库: RegexOnNSString
开源库,包含如下函数:
-(NSString *) stringByReplacingRegexPattern:(NSString *)regex withString:(NSString *) replacement caseInsensitive:(BOOL)ignoreCase
并使用NSRegularExpression
类。非常容易使用,无需担心任何事情。
请注意,自Mac OS X v10.7和IOS 4.0以来NSRegularExpression
可用,如Datasmid所述。
答案 9 :(得分:1)
我很容易。我在Objective C项目中添加了一个新的C ++文件,将其重命名为.mm,然后在里面创建一个标准的C ++类。然后,我在" public中创建一个静态类方法:" C ++函数的一节,它接受一个NSString并返回一个NSString(或NSArray,如果你想要的话)。然后我将NSString转换为C ++ std :: string,如下所示:
// If anyone knows a more efficient way, let me know in the comments.
// The "if" condition below is because ObjC crashes if converting to
// std::string if the string is nil or empty.
// assume #include <string>
std::string s = "";
if (([sInput != nil]) && (!([sInput isEqualTo:@""]))) {
std::string sTemp([sInput UTF8String]);
s = sTemp;
}
从那里,我可以像这样使用regex_replace:
// assume #include <regex>
std::string sResult = std::regex_replace(sSource,sRegExp,sReplaceWith);
然后,我可以将std :: string转换回NSString:
NSString *sResponse2 = @(sResult.c_str());
如果您只是为此函数使用此C ++,那么您可能会发现它适合调用此文件extra.mm(类名Extra)并将此静态类方法放入其中,然后添加其他静态类当情况到达的时候,在C ++中使用它的方法是有意义的,因为在某些情况下它不那么麻烦。 (有些情况下ObjC使用较少的代码行执行某些操作,而某些情况下C ++使用较少的代码行执行此操作。)
P.S。还有另一种方法是使用.mm文件,但使用std :: string和std :: regex_replace()(或regex_match())制作Objective C包装。