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

初始 Google 表明在 Objective-C Cocoa 应用程序中没有内置的正则表达式。

四个问题:

  1. 这是真的吗?

  2. 开什么玩笑?

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

  4. 有什么方法可以在不导入库(也许是 NSScanner 类)的情况下获得足够的接近?

78355 次浏览

您可以使用 POSIX 正则表达式库(为符合 POSIX 的操作系统欢呼)

man 3 regex

RegexKit 是我目前发现的最好的,非常的 Cocoa: y. 我在我们的几个 iPhone 应用程序中使用了“ Lite”版本:

源泉锻造

我是 lingonikorg

我喜欢使用 PCRE 的 AGRegex 框架,如果您熟悉 PCRE 语法,那么它很方便。这个框架的最佳版本是 Colloquy IRC 客户端中的一个,因为它已经升级为使用 PCRE 6.7:

Http://colloquy.info/project/browser/trunk/frameworks/agregex

它非常轻量级,比 RegExKit 更轻量级(当然不是那么轻量级)。

  1. 是的,Cocoa 中没有正则表达式支持。如果您只对布尔匹配感兴趣,可以使用支持 ICU 正则表达式语法的 NSPrephate。但是通常您感兴趣的是匹配项的位置或子表达式的位置,而使用 NSPreate 无法得到它。
  2. 如前所述,您可以使用 正则表达式 POSIX 函数。但是它们被认为是缓慢的,并且与其他解决方案(ICU/Pcre)相比,正则表达式语法是有限的。
  3. 有许多 OSS 库,CocoaDev 的名单很长
  4. 例如,RegExKitLite 不需要任何库,只需将. m 和. h 添加到项目中。

    (我对 RegExKitLite 的抱怨是,它通过分类扩展了 NSString,但它也可以被视为一个特性。此外,它还使用了随操作系统一起提供的非公共 ICU 库,这是苹果公司不推荐的。)

在搜索这个主题的过程中,我遇到了使用 鬼沼CocoaOniguruma,它是 Ruby1.9和 PHP5背后的正则表达式引擎。与现有的 OregKit(日语)相比,它似乎有点新。不知道这些和其他绑定有什么区别。

我注意到,在 iOS 4.0中,苹果提供了一个 。此外,在10.7中,这个类也提供了 在操作系统 X 下

我用来解决 REGEX 和 JSON 解析问题的廉价而肮脏的黑客解决方案是创建一个 UIWebView 对象并注入 Javascript 函数来进行解析。然后,javascript 函数返回我所关心的值的字符串(或值列表)。实际上,您可以存储一个为特定任务定制的小型函数库集,然后根据需要调用它们。

我不知道这种技术是否适用于大量的重复解析请求,但是对于快速事务性的东西,它可以在不依赖任何额外的外部资源或代码的情况下完成任务。

自从 Mac OS X v10.7和 IOS 4.0以来,NSRegularExpression就可用了。

在谷歌上搜索了一下,找到了这个图书馆: RegexOnNSString

开源库,包含以下函数:

-(NSString *) stringByReplacingRegexPattern:(NSString *)regex withString:(NSString *) replacement caseInsensitive:(BOOL)ignoreCase

和使用 NSRegularExpression类。非常容易使用,不需要担心任何事情。

请注意,正如 Datasmid 所提到的,NSRegularExpression从 Mac OS X v10.7和 IOS 4.0开始就可用了。

我让事情变得简单。我将一个新的 C + + 文件添加到我的 Objective C 项目中,并将其重命名为。然后在内部创建一个标准的 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 _ place:

// assume #include <regex>
std::string sResult = std::regex_replace(sSource,sRegExp,sReplaceWith);

然后,我可以使用以下命令将 std: : string 转换回 NSString:

NSString *sResponse2 = @(sResult.c_str());

如果你只是为了这个函数而使用这个 C + + ,那么你可能会发现它适合调用这个文件 Extra.mm (类名额外) ,并把这个静态类方法放进去,然后再添加其他的静态类方法,当这种情况发生的时候,在 C + + 中这样做就有意义了,因为在某些情况下这样做不那么麻烦。(有些情况下,ObjecC 用较少的代码行完成某些工作,有些情况下,C + + 用较少的代码行完成某些工作。)

另外,还有一种方法是使用。Mm 文件,但是为 std: : string 和 std: : regex _ place ()(或 regex _ match ())的使用创建一个 Objective C 包装器。