我正在以这种格式解析一个正常的字符串:
上午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]'
因为它无法分隔时间字符串中的项目。我确信即使我让客户端修复了这些错误,他们也会在某个时候重新插入一条带有此错误的记录。我如何解释这两种情况?
答案 0 :(得分:2)
这正是为正则表达式制作的那种问题。
在您描述的情况下,下面的代码会将字符串timeString
分成两个单独的时间firstTime
和secondTime
,无论是正确还是错误。它将处理多个空间,没有空格或任何空格字符而不是空格,使其比仅假设在仪表板两侧最多有一个空格更加强大:
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产生完全相同的结果,所以我希望有所帮助。