在iPhone上的NSRegularExpression和捕获组

时间:2011-01-20 17:11:18

标签: iphone objective-c regex mediawiki

我需要在iphone上使用正则表达式进行一些小动作。 基本上我在一个私人MediaWiki中有一个日期列表,其形式为
*185 BC: SOME EVENT HERE
*2001: SOME OTHER EVENT MUCH LATER

我现在想要将其解析为具有NSDate属性和-say-NSString属性的Object。 到目前为止我有这个:( rawContentString包含页面的mediawiki语法)

NSString* regexString =@"\\*( *[0-9]{1,}.*): (.*)";
NSRegularExpressionOptions options = NSRegularExpressionCaseInsensitive;
NSError* error = NULL;

NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:regexString options:options error:&error];
if (error) {
    NSLog(@"%@", [error description]);
}

NSArray* results = [regex matchesInString:rawContentString options:0 range:NSMakeRange(0, [rawContentString length])];
for (NSTextCheckingResult* result in results) {

    NSString* resultString = [rawContentString substringWithRange:result.range];
    NSLog(@"%@",resultString);
}

不幸的是,我认为正则表达式没有按照我希望的方式工作,我不知道如何捕获匹配的日期和文本。 任何帮助都会很棒。 顺便说一下:MediaWiki语法的某个地方有一个正则表达式模式编译吗?

提前致谢 海科 *

2 个答案:

答案 0 :(得分:3)

我的问题是我使用的是matchesInString,我需要使用firstMatchInString,因为它会在一个NSTextCheckingResult中返回多个范围。

这是违反直觉的,但确实有效。

我从http://snipplr.com/view/63340/

得到答案

我的代码(用于解析信用卡跟踪数据):

NSRegularExpression *track1Pattern = [NSRegularExpression regularExpressionWithPattern:@"%.(.+?)\\^(.+?)\\^([0-9]{2})([0-9]{2}).+?\\?." options:NSRegularExpressionCaseInsensitive error:&error];

NSTextCheckingResult *result = [track1Pattern firstMatchInString:trackString options:NSMatchingReportCompletion range:NSMakeRange(0, trackString.length)];

self.cardNumber = [trackString substringWithRange: [result rangeAtIndex:1]];
self.cardHolderName = [trackString substringWithRange: [result rangeAtIndex:2]];
self.expirationMonth = [trackString substringWithRange: [result rangeAtIndex:3]];
self.expirationYear = [trackString substringWithRange: [result rangeAtIndex:4]];

答案 1 :(得分:2)

至于正则表达式,我认为围绕这​​些方面的事情:

\*([ 0-9]{1,}.*):(.*)

应该更好地满足您的需求。你没有逃避第一个*,为什么在第一组声明中有*?