【问题标题】:Extracting single values from a parsed NSString in objective-c从objective-c中解析的NSString中提取单个值
【发布时间】:2013-04-10 03:30:19
【问题描述】:

这些是我的示例 NSStrings(解析为数组),经过简化。

单个字符串对象被解析为“STRING1, STRING2 then DATE TIME then - A:VALUE”,例如:

The name of first value, first 17/04/2013 11:30:00 - A:30.0 // sometimes there is a comma after first string
The name of second value 17/04/2013 11:00:00 - A:20.0 // sometimes there is NOT a comma after first string
Name of third value 17/04/2013 10:30:00 - A:40.0
Fourth 17/04/2013 09:40:00 - A:50.0
Fifth value 17/04/2013 05:00:00 - A:10.0

好吧,我需要提取STRING或STRING的单独值,STRING:

The name of first value, first
The name of second value
Name of third value
Fourth
Fifth value

然后是日期和时间

17/04/2013 11:30:00
17/04/2013 11:00:00
17/04/2013 10:30:00
17/04/2013 09:40:00
17/04/2013 05:00:00

最后是单个 VALUES:

30.0
20.0
40.0
50.0
10.0

编辑:我正在尝试使用 Martin R 的代码来解析 *allValues:

The *allValues array is something like: 
    (
        "The name of first value, first 17/04/2013 11:30:00 - A:30.0",
        "The name of second value 17/04/2013 11:00:00 - A:20.0",
        "Name of third value 17/04/2013 10:30:00 - A:40.0",
        "Fourth 17/04/2013 09:40:00 - A:50.0",
        "Fifth value 17/04/2013 05:00:00 - A:10.0"
    )

这里是提取单个值的代码:

NSMutableArray *allValues = [parsedFeed valueForKey:@"values"];

for (int i=1; i < [allValues count]; i++) {
    NSString *string = [allValues objectAtIndex:i];
    NSString *pattern = @"(.*) (\\d{2}/\\d{2}/\\d{4} \\d{2}:\\d{2}:\\d{2}) - A:(.*)";
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:NULL];
    NSTextCheckingResult *match = [regex firstMatchInString:string options:0 range:NSMakeRange(0, [string length])];

    if (match != nil) {
    NSString *s1 = [string substringWithRange:[match rangeAtIndex:1]];
    NSString *s2 = [string substringWithRange:[match rangeAtIndex:2]];
    NSString *s3 = [string substringWithRange:[match rangeAtIndex:3]];
    NSLog(@"First part:  %@", s1);
    NSLog(@"Second part: %@", s2);
    NSLog(@"Third part:  %@", s3);
    }
}

但在这种情况下,我无法获得任何 NSLog 结果(ma​​tch == nil)。发生了什么?谢谢!

【问题讨论】:

  • What have you tried? 我们不是来为您解决问题,而是帮助您解决在尝试解决问题时遇到的特定问题。您可能还想看看FAQ

标签: objective-c regex nsstring nsarray nsregularexpression


【解决方案1】:

如果 DATE/TIME 有固定格式,可以使用正则表达式:

NSString *string = @"The name of first value, first 17/04/2013 11:30:00 - A:30.0";
NSString *pattern = @"(.*) (\\d{2}/\\d{2}/\\d{4} \\d{2}:\\d{2}:\\d{2}) - A:(.*)";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern
                                       options:0 error:NULL];
NSTextCheckingResult *match = [regex firstMatchInString:string options:0 range:NSMakeRange(0, [string length])];
if (match != nil) {
    NSString *s1 = [string substringWithRange:[match rangeAtIndex:1]];
    NSString *s2 = [string substringWithRange:[match rangeAtIndex:2]];
    NSString *s3 = [string substringWithRange:[match rangeAtIndex:3]];
    NSLog(@"First part:  %@", s1);
    NSLog(@"Second part: %@", s2);
    NSLog(@"Third part:  %@", s3);
}

输出:

第一部分:第一个值的名称,first 第二部分:17/04/2013 11:30:00 第三部分:30.0

【讨论】:

  • 非常感谢@Martin R,您的代码非常适合 ONE 固定字符串,但如果您在我的问题上看到 EDIT,我无法使用它从 NSMutableArray 的字符串中提取值。 . 有什么问题吗?
  • @Huxley:请注意,您的循环从索引 1 而不是 0 开始,并且您的第一个字符串在时间字段中使用点 (.) 而不是冒号 (:)。我的正则表达式检查冒号。可以将其概括为检查点或冒号。 - 除此之外,我没有看到数组有问题,并且您的编辑代码在我的测试应用程序中没有问题。
  • 完美,马丁,这是一个拼写错误! :) 最后一个双精度,例如,“概括”点或冒号检查的方法是什么,你能提供代码吗?再次感谢您!
  • @Huxley:在正则表达式中将: 替换为(?:\\.|:)。 (我应该为此收取奖励积分:-)
【解决方案2】:

NSString 类提供了许多不同的方法来完成你想要的。 查找、组合和划分字符串和子字符串。 看看这些方法,我相信你可以将它们组合起来得到你想要的字符串。我认为您将需要一些 if() else 大括号。

http://developer.apple.com/library/ios/#Documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html

希望对你有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-05
    • 2012-02-12
    • 2010-10-29
    • 1970-01-01
    • 2023-03-08
    • 2012-08-22
    • 1970-01-01
    相关资源
    最近更新 更多