NSRegularExpression и захват групп на iphone - PullRequest
5 голосов
/ 20 января 2011

Мне нужен небольшой кикстарт для регулярных выражений на iphone.По сути, у меня есть список дат в приватном MediaWiki в форме
*185 BC: SOME EVENT HERE
*2001: SOME OTHER EVENT MUCH LATER

Теперь я хочу разобрать это в объект, который имеет свойство NSDate и -скажем - NSString собственности.У меня есть это до сих пор: (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 где-нибудь?

Заранее спасибо Heiko *

Ответы [ 2 ]

3 голосов
/ 13 ноября 2013

Моя проблема заключалась в том, что я использовал 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]];
2 голосов
/ 20 января 2011

Что касается регулярного выражения, я думаю, что-то вроде этих строк:

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

должно работать лучше, чем вам нужно.Вы не избегаете первого *, и почему в первом утверждении группы есть *

...