【问题标题】:NSRegularExpression and capture groups on iphoneNSRegularExpression 和 iPhone 上的捕获组
【发布时间】:2011-06-12 14:59:09
【问题描述】:

我需要在 iphone 上开始使用正则表达式。 基本上,我在私人 MediaWiki 中有一个日期列表,格式为
*185 BC: SOME EVENT HERE
*2001: SOME OTHER EVENT MUCH LATER

我现在想将其解析为一个具有 NSDate 属性和 -say- 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 语法编译正则表达式模式吗?

提前致谢 平子 *

【问题讨论】:

  • 如果我是你,我会使用regexkit.sourceforge.net。根据我的经验,它的性能要好得多,而且通常你会得到你需要的东西。
  • 您好,感谢您的提示。我调查了一下。但是我的应用程序只能在 4.0+ 上运行,所以我认为使用 IOS 正则表达式功能会更好。不是这样吗?
  • AFAIK 他们使用相同的底层内容,而 regexkit 似乎更好用 - 但我想这真的是个人喜好。但也许其他人对此了解更多。
  • (仅供参考,我是 RegexKitLite 的作者)。 NSRegularExpression 和 RegexKitLite 都使用与 libicucore 完全相同的 ICU 正则表达式引擎。理论上它们应该提供相同的结果,但实际上可能存在一些极其细微的差异(例如,RegexKitLite 必须专门使用公共 API,而 NSRegularExpression 可以使用私有 API)。正如@LordT 所说,我认为区别在于“个人偏好”。此外,在撰写本文时,RegexKitLite 几乎可以在所有 Mac OS X 和 iOS 版本上运行。
  • 感谢您的澄清,约翰

标签: iphone objective-c regex mediawiki


【解决方案1】:

至于正则表达式,我认为围绕这​​些行:

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

应该更好地满足您的需求。你没有转义第一个 *,为什么第一个 group 语句中有一个 *?

【讨论】:

  • 嘿,谢谢 - 看起来更干净 :-) 至于第一组中的 *:我想为 '*' 和日期之间的空格做准备。
  • 这是有道理的,但它会是[ ]*,而不是` *`
  • 太棒了 :-) 我在另一个正则表达式中有同样的东西。所以你刚刚为我解决了几个问题......谢谢
【解决方案2】:

我的问题是我使用的是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]];

【讨论】:

    猜你喜欢
    • 2014-09-08
    • 1970-01-01
    • 2015-10-08
    • 2015-10-03
    • 2011-10-12
    • 2016-06-20
    • 2012-03-24
    • 2012-09-01
    相关资源
    最近更新 更多