【问题标题】:NSRegularExpression for retrieving numbers from a stringNSRegularExpression 用于从字符串中检索数字
【发布时间】:2011-12-05 19:55:48
【问题描述】:

我使用 NSScanner 从下面的文本中检索数字。但有时结果并不像预期的那样。听说可用于 iOS 4 的 NSRegularExpression 类更好地进行这种类型的提取。由于我是 NSRegularExpression 的初学者,我发现 Apple 提供的文档很难理解。任何帮助将不胜感激。谢谢。

输入:

1D03 04 10 17 47 D24--

输出:

03 04 10 17 47 24

前5组数字小于59,最后一组小于39。

【问题讨论】:

  • NSScannerNSRegularExpression 的困难在于将所有可能的输入模式映射到所需的输出模式。如果这三种情况是预期的唯一输入模式,那么您很可能可以使用单个正则表达式模式处理所有替换。如果有帮助,我可以从我的一个实现中发布通用正则表达式代码;但老实说,它类似于 Apple 文档中提供的内容。
  • @iSharreth 可能会有所帮助cocoabuilder.com/archive/cocoa/…

标签: iphone objective-c regex xcode nsregularexpression


【解决方案1】:

试试这个..

NSString *originalString = @"1D03 04 10 17 47 D24---";

NSLog(@"%@", originalString);
NSMutableString *strippedString = [NSMutableString 
                                   stringWithCapacity:originalString.length];

NSScanner *scanner = [NSScanner scannerWithString:originalString];
NSCharacterSet *numbers = [NSCharacterSet 
                           characterSetWithCharactersInString:@"0123456789  "];

while ([scanner isAtEnd] == NO) {
    NSString *buffer;
    if ([scanner scanCharactersFromSet:numbers intoString:&buffer]) {
        [strippedString appendString:buffer];

    } else {
        [scanner setScanLocation:([scanner scanLocation] + 1)];
    }
}

NSLog(@"%@", strippedString);

【讨论】:

  • 不错。尽管这在第二个输入行中失败,其中“2Q”预计会给出“20”。 (除非这是最初问题中的印刷错误。)由于缺少空格,它在第三行也失败了。同样,假设间距是输出要求。
  • 现在是。在我发表评论后,对 OP 进行了编辑,删除了三种不同模式中的两种。最初提问者给出了三个需要满足的模式。
  • 是的,看看原始海报所做的编辑。当我回复您的回答时,他在问题中列出了三种输入模式和三种输出模式。在我发表评论后,他删除了三个中的两个(您的扫描仪不满足的两个。)
  • @userar,您的回答为1D03 提供103,但OP 只需要03
【解决方案2】:

或者这个:

NSString *string = @"1D03 04 10 17 47 D24---";

NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\S*(\\d{2})\\S*"
                                                                       options:NSRegularExpressionCaseInsensitive
                                                                         error:&error];


NSString *modifiedString = [regex stringByReplacingMatchesInString:string
                                                           options:0
                                                             range:NSMakeRange(0, [string length])
                                                      withTemplate:@"$1"];

此正则表达式匹配以 0 个或多个非空格字符 (\S) 开头和结尾且中间有两个数字 (\d) 的所有内容。匹配项被字符串中间的两位数字替换。

【讨论】:

  • 非常感谢您的回答托比亚斯。它运行良好。我正在将此模式用于 tesseract 引擎的强力球、megamillaion 等 ..tickets 的 ocr 输出。即使缺少空格字符,如何编辑此正则表达式以获取输出?例如,如果输入是 1D03 0410 17 47 D24--- 输出应该是 03 04 10 17 47 24
  • 另外前5组数字只会在01到59之间,最后一组只会在01到39之间。
猜你喜欢
  • 2016-07-25
  • 2011-09-29
  • 1970-01-01
  • 2017-10-22
  • 1970-01-01
  • 1970-01-01
  • 2012-02-13
  • 2014-07-01
  • 1970-01-01
相关资源
最近更新 更多