如何在iOS中修复此字符串格式?

时间:2013-08-11 03:54:13

标签: ios parsing nsstring

我正在以这种格式解析一个正常的字符串:

  

上午8:00 - 晚上9:00

我使用此代码将开放与关闭时间分开,我获得了2次数组:

NSCharacterSet *digits = [NSCharacterSet decimalDigitCharacterSet];
    int idx = [s rangeOfCharacterFromSet:digits].location;
    NSString *timeStr = [s substringFromIndex:idx];
    NSArray *timeStringsArray2 = [timeStr componentsSeparatedByString:@" - "];
    NSLog(@"timeStringsArray2 %@", timeStringsArray2);

问题是某些时间字符串写得不正确:

  

上午8:00 - 晚上9:00

这个简单的错误会引发错误:

-[__NSArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]'

因为它无法分隔时间字符串中的项目。我确信即使我让客户端修复了这些错误,他们也会在某个时候重新插入一条带有此错误的记录。我如何解释这两种情况?

3 个答案:

答案 0 :(得分:2)

这正是为正则表达式制作的那种问题。

在您描述的情况下,下面的代码会将字符串timeString分成两个单独的时间firstTimesecondTime,无论是正确还是错误。它将处理多个空间,没有空格或任何空格字符而不是空格,使其比仅假设在仪表板两侧最多有一个空格更加强大:

NSString *timeString = @"8:00AM - 9:00PM";

NSString *pattern = @"\\s*-\\s*";//Matches zero or more whitespace characters surrounding a dash character

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern
                                                                       options:0 error:NULL];

NSTextCheckingResult *match = [regex firstMatchInString:timeString
                                                options:0
                                                  range:NSMakeRange(0, [timeString length])];
if (match) {
    NSRange matchRange = [match range];
    NSString* firstTime = [timeString substringToIndex:matchRange.location];
    NSString* secondTime = [timeString substringFromIndex:matchRange.location + matchRange.length];

    NSLog(@"First time: %@", firstTime);
    NSLog(@"Second time: %@", secondTime);
}

答案 1 :(得分:2)

虽然我们在这里 - 不要依赖在这里和那里的空白!要修复代码,首先删除所有空格,然后用连字符分隔(不再使用空格):

NSString *timeStr = @"8:00AM- 9:00PM";
NSString *stripped = [timeStr stringByReplacingOccurrencesOfString:@" " withString:@""];
NSArray *times = [stripped componentsSeparatedByString:@"-"];

就是这样。

答案 2 :(得分:1)

对不起,我不知道如何使你的代码工作,但我只是测试了我的方式:

NSString *testString = [NSString stringWithFormat:@"%@%@", @"8:00AM - 9:00PM", @"*"];
NSScanner *scanner = [NSScanner scannerWithString:testString];
[scanner setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@" -"]];
NSString *startTime = nil, *endTime = nil;
while ([scanner scanUpToString:@"-" intoString:&startTime] && [scanner scanUpToString:@"*" intoString:&endTime]) {
    // Process the row as needed.
    NSLog(@"Start time:%@, End time:%@", startTime, endTime);
}

正确产生输出:

2013-08-11 00:29:20.665 StackOverflowTests [15213:c07]开始时间:上午8:00,结束时间:晚上9:00

它也会在上午8:00到晚上9:00产生完全相同的结果,所以我希望有所帮助。