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

Objective-C应用程序中的正则表达式,objective-c,regex,cocoa,Objective C,Regex,Cocoa,最初的谷歌搜索表明,在Objective-C Cocoa应用程序中没有内置的正则表达式 因此,有四个问题: 这是真的吗 你在开玩笑吗 好的,那你推荐一个不错的开源库吗 有哪些方法可以在不导入库的情况下(可能是使用NSScanner类)获得足够的接近度 您可以使用POSIX正则表达式库(适用于符合POSIX的操作系统)。试一试 RegexKit是我找到的最好的。非常好。我在我们的几个iPhone应用程序中使用“Lite”版本: 我喜欢使用PCRE的AGRegex框架,如果您习惯了PCRE语法,它

最初的谷歌搜索表明,在Objective-C Cocoa应用程序中没有内置的正则表达式

因此,有四个问题:

  • 这是真的吗

  • 你在开玩笑吗

  • 好的,那你推荐一个不错的开源库吗

  • 有哪些方法可以在不导入库的情况下(可能是使用NSScanner类)获得足够的接近度


  • 您可以使用POSIX正则表达式库(适用于符合POSIX的操作系统)。试一试


    RegexKit是我找到的最好的。非常好。我在我们的几个iPhone应用程序中使用“Lite”版本:


    我喜欢使用PCRE的AGRegex框架,如果您习惯了PCRE语法,它会很方便。此框架的最佳版本是Colloquy IRC客户端中的版本,因为它已升级为使用PCRE 6.7:

    它非常轻,比RegExKit轻得多(尽管当然没有RegExKit那么强大)

  • 是的,Cocoa中没有regex支持。如果您只对布尔匹配感兴趣,可以使用支持ICU正则表达式语法的。但通常您对匹配的位置或子表达式的位置感兴趣,而使用NSPredicate无法获得它
  • 如前所述,您可以使用。但它们被认为速度较慢,并且与其他解决方案(ICU/)相比,正则表达式语法受到限制
  • 有很多OSS库
  • 例如,不需要任何库,只需将.m和.h添加到项目中即可

    (我对RegExKitLite的抱怨是它通过category扩展了NSString,但也可以将其视为一项功能。此外,它还使用了操作系统附带的非公共ICU库,这是苹果公司不推荐的。)


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

    我注意到,从iOS 4.0开始,苹果提供了一个新的绑定。此外,从10.7开始,该类就可以使用。

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


    我不知道这项技术是否可以扩展到大量重复的解析请求,但对于快速事务处理,它可以在不依赖任何额外的外部资源或您可能不理解的代码的情况下完成任务。

    NSRegularExpression
    自Mac OS X v10.7和IOS 4.0以来一直可用。

    ,找到此库:

    开源库,包含以下函数:

    -(NSString *) stringByReplacingRegexPattern:(NSString *)regex withString:(NSString *) replacement caseInsensitive:(BOOL)ignoreCase
    
    并使用
    NSRegularExpression
    类。非常容易使用,无需担心任何事情


    请注意,
    NSRegularExpression
    自Mac OS X v10.7和IOS 4.0开始提供,如Datasmid所述。

    。我在我的目标C项目中添加了一个新的C++文件,将它重命名为.mm,然后在里面创建一个标准C++类。然后,我在C++函数中的“Pult:”部分中使用静态类方法,它采用NSCORT并返回NSCORE(或者NSCORE,如果这是您想要的)。然后,将NSString转换为C++ STD::字符串,类似于::/P>
    // 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;
    }
    

    如果你只为这个函数使用这个C++,那么你可能会发现它适合调用这个文件Out.mm(类名额外)并把这个静态类方法放入,然后在情况到达时添加其他静态类方法,在C++中做它是有意义的,因为在某些情况下它不那么麻烦。(Objc有一些代码行较少的情况,有些情况下C++用更少的代码行。)< /P>


    另一种方法是使用.mm文件,但要围绕std::string和std::regex_replace()(或regex_match())的使用制作一个客观的C包装器。

    哦,我明白了。这是一种在straight C中实现的方法,在任何objective-C应用程序中都应该可以使用。酷,谢谢!这基本上是公认的方法吗?这是一种不需要任何附加依赖项的方法。还有其他的选择,比如可以导入的开源库(PCRE,对于Perl正则表达式,如果您使用的是Obj-C++,则可以导入Boost正则表达式库,或者其他答案中列出的其他库)?您是否可以包含一段代码片段,用于在NSString之间进行转换?再次感谢!Objective-C是建立在C之上的,所以你没有真正混合任何东西。不过,大多数人都使用库,因为它提供了一个更易于使用的API。而且因为POSIX正则表达式函数只处理ASCII字符串。我支持RegexKit Lite。很不错的!酷,使用它的人越多,它可能会变得越好!如果它有完全兼容perl的正则表达式,为什么功能会变差呢?相关的Objective-C帮助程序方法没有RegExKit中的方法那么广泛,但是它们在大多数情况下都很好。请记住,POSIX正则表达式函数不能与unicode(仅ASCII)一起使用.FYI NSPredicate url是一个断开的链接IOS支持用于子字符串搜索的正则表达式,例如,
    [myString rangeOfString:@“regex_here”选项:NSRegularExpressionSearch]
    在Lion(10.7)中也可用,如果MAC_OS_X_VERSION_10_7我发现使用非公共ICU库很好,因为如果需要使用它,这是因为您的Cocoa版本中没有内置的正则表达式支持。如果您使用这些库,也意味着您正在为较旧的系统构建,这些系统将不再被更改,因为它们不受支持。如果要同时为旧版和新版进行构建,则在NSRegularExpression不存在时,可以使用RegExKitLite作为备用项。(是的,仍然有人在使用旧系统)。嗯
    // 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;
    }
    
    // assume #include <regex>
    std::string sResult = std::regex_replace(sSource,sRegExp,sReplaceWith);
    
    NSString *sResponse2 = @(sResult.c_str());