2009-07-18 60 views
1

我遇到了将会匹配的RegExKitLite表达式。我正在解析一个字符串,我希望它抓住所有东西,直到遇到第一个冒号RegExKitLite表达式问题

RegExKitLite中的表达式会这样做吗?

谢谢!

回答

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: @":"]; 
+0

太棒了...谢谢 – Xcoder 2009-07-18 02:44:38

0

要使用专门RegexKitLite做到这一点,你需要做到以下几点:

添加回复gexKitLite.h/.m文件到您的项目

导入RegexKitLite.h到该文件中,你需要使用正则表达式

使用以下冒号前抢东西:

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

我相当肯定,不需要括号 - 你可以删除他们,只使用组0.(假设*是正常的贪婪,尾部冒号是多余的,可以被删除,如果是的话,组1是与组0相同,因此不需要额外的分组)。 – 2009-07-18 02:30:03

0

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

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];