【发布时间】:2009-07-18 01:56:20
【问题描述】:
我在想出一个匹配的 RegExKitLite 表达式时遇到了麻烦。我正在解析一个字符串,我希望它能够抓取所有内容,直到第一次出现冒号
RegExKitLite 中的表达式是什么?
谢谢!
【问题讨论】:
标签: iphone objective-c regex
我在想出一个匹配的 RegExKitLite 表达式时遇到了麻烦。我正在解析一个字符串,我希望它能够抓取所有内容,直到第一次出现冒号
RegExKitLite 中的表达式是什么?
谢谢!
【问题讨论】:
标签: iphone objective-c regex
这个正则表达式将匹配从开始到(但不包括)第一个冒号的所有内容:
^[^:]*
包含第一个冒号就像把它放在末尾一样简单:
^[^:]*:
因此,要将其中任何一个与 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: @":"];
【讨论】:
要专门使用 RegexKitLite 执行此操作,您需要执行以下操作:
将 RegexKitLite.h/.m 文件添加到您的项目中
将 RegexKitLite.h 导入到需要使用正则表达式的文件中
使用以下内容抓取冒号前的内容:
NSString * everythingBeforeTheColon = [someString stringByMatching:@"([^:]*):" capture:1];
【讨论】:
我刚刚更新了我的 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];
【讨论】: