【问题标题】:RegExKitLite Expression QuestionRegExKitLite 表达式问题
【发布时间】:2009-07-18 01:56:20
【问题描述】:

我在想出一个匹配的 RegExKitLite 表达式时遇到了麻烦。我正在解析一个字符串,我希望它能够抓取所有内容,直到第一次出现冒号

RegExKitLite 中的表达式是什么?

谢谢!

【问题讨论】:

    标签: iphone objective-c regex


    【解决方案1】:

    这个正则表达式将匹配从开始到(但不包括)第一个冒号的所有内容:

    ^[^:]*
    


    包含第一个冒号就像把它放在末尾一样简单:

    ^[^:]*:
    


    因此,要将其中任何一个与 RegexKitLite 一起使用,您可以这样做:

    NSString * firstItem = [someString stringByMatching:@"^[^:]*" capture:0];
    

    注意如何没有括号 - 因为 * 是贪婪的,您可以简单地使用否定类并使用捕获的组 0(即整个匹配)。


    值得注意的是,大多数语言都包含允许您使用常规函数执行此操作的函数,例如 ListFirst(MyString,':')MyString.split(':')[0]

    我怀疑 Objective-C 有类似的东西......是的,见 here

    NSString *string = @"oop:ack:bork:greeble:ponies";
    NSArray *chunks = [string componentsSeparatedByString: @":"];
    

    【讨论】:

      【解决方案2】:

      要专门使用 RegexKitLite 执行此操作,您需要执行以下操作:

      将 RegexKitLite.h/.m 文件添加到您的项目中

      将 RegexKitLite.h 导入到需要使用正则表达式的文件中

      使用以下内容抓取冒号前的内容:

      NSString * everythingBeforeTheColon = [someString stringByMatching:@"([^:]*):" capture:1];
      

      【讨论】:

      • 我相当确定不需要括号 - 您可以删除它们并只使用第 0 组。(假设 * 正常情况下是贪婪的,尾随冒号是多余的,可以删除,并且如果是这样,那么第 1 组与第 0 组相同,因此不需要额外的分组)。
      • @Peter 很有趣,我从没想过那样做。我更喜欢放在括号中,这样我就可以确定我得到了什么。 =)
      【解决方案3】:

      我刚刚更新了我的 SO 答案 here,所以我想我会用它来对标准基础组件SeparatedByString: 和 RegexKitLites componentsSeparatedByRegex: 进行基准测试。每个 for() 循环中的代码行(基本上)是:

      NSString *string = @"oop:ack:bork:greeble:ponies";
      for() { NSArray *chunks = [string componentsSeparatedByString: @":"]; }
      for() { NSArray *chunks = [string componentsSeparatedByRegex: @":"]; }
      

      返回的时间是(每次操作的时间以微秒为单位):

      componentsSeparatedByString: 3.96810us
      componentsSeparatedByRegex:  2.46155us
      

      编辑:

      我想我会做得更好:如何使用 RegexKitLite 从包含多行冒号分隔数据的字符串(即 /etc/passwd)创建 NSArray 的 NSArray。从 RegexKitLite 文档中的逗号分隔值示例修改。完成后,变量 splitLinesArray 包含成品。

      NSString   *theString  = @"a:b:c\n1:2:3\nX:Y:Z\n"; // An example string to work on.
      NSArray    *linesArray = [theString componentsSeparatedByRegex:@"(?:\r\n|[\n\v\f\r\\x85\\p{Zl}\\p{Zp}])"];
      id          splitLines[[linesArray count]];
      NSUInteger  splitLinesIndex = 0UL;
      
      for(NSString *lineString in linesArray) { splitLines[splitLinesIndex++] = [lineString componentsSeparatedByRegex:@":"]; }
      
      NSArray *splitLinesArray = [NSArray arrayWithObjects:splitLines count:splitLinesIndex];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-27
        • 2020-02-21
        • 2011-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多