Objective-C Cocoa应用程序中的正则表达式

时间:2009-01-07 21:18:55

标签: objective-c regex cocoa

Initial Googling表示在Objective-C Cocoa应用程序中没有内置的正则表达式。

所以有四个问题:

  1. 这是真的吗?

  2. 你在开玩笑吗?

  3. 好的,那么你推荐一个不错的开源库吗?

  4. 有什么方法可以在不导入库的情况下获得足够接近,可能使用NSScanner类?

10 个答案:

答案 0 :(得分:141)

我注意到,从iOS 4.0开始,Apple提供NSRegularExpression class。此外,从10.7开始,该课程可用under OS X

答案 1 :(得分:42)

  1. 是的,Cocoa中没有正则表达式支持。如果您只对布尔匹配感兴趣,可以使用支持ICU正则表达式语法的NSPredicate。但通常你会对子表达式的匹配或位置感兴趣,而你无法通过NSPredicate得到它。
  2. 如上所述,您可以使用regex POSIX functions。但它们被认为是缓慢的,与其他解决方案相比,正则表达式语法有限(ICU / pcre)。
  3. 有许多OSS库,CocoaDev has an extensive list
  4. 例如,
  5. RegExKitLite不需要任何库,只需将.m和.h添加到项目中。

    (我对RegExKitLite的投诉是它通过类别扩展NSString,但它也可以被视为一个功能。它还使用操作系统附带的非公共ICU库,Apple不推荐这样做。)

答案 2 :(得分:19)

RegexKit是我发现的最好的。非常可可:y。我在几个iPhone应用程序中使用“Lite”版本:

sourceforge

lingonikorg

答案 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)

自Mac OS X v10.7和IOS 4.0以来,

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包装。