如何在没有硬编码位置的情况下从NSString中正确提取子串?

时间:2013-07-24 17:14:05

标签: ios objective-c nsstring substring

我有这个字符串返回:

  

“周一至周五上午8:00 - 下午7:30”

我需要消除mon-fri的东西才能得到这个:

  

“上午8:00 - 下午7:30”

然后我需要将其拆分为开放时间和关闭时间,以确定其是否开启:

  

“上午8:00”&& “7:30 PM”

但是有很多商店,他们有不同的开始和结束时间,所以我不能从8或类似的东西中提取6个字符。

到目前为止,我决定走这条路:

NSRange startRange = [storeTime.text rangeOfString:@"-"];

NSString *openString = [storeTime.text substringWithRange:NSMakeRange(16, startRange.location-17)];

NSString *closeString = [storeTime.text substringWithRange:NSMakeRange(startRange.location+2, storeTime.text.length-(startRange.location+2))];

但是看起来我可能会因为16岁的硬编码而破裂,这让我想知道它是否会在其他任何地方打破。关于如何实现这个目标的任何更好的想法?

3 个答案:

答案 0 :(得分:8)

您可以使用NSRegularExpression从字符串中抓取两个时间字符串:

NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression
     regularExpressionWithPattern:@"\\d{1,2}:\\d{2} (AM|PM)"
                          options:NSRegularExpressionCaseInsensitive
                            error:&error];
NSString *str = @"Monday thru Friday 8:00 AM - 7:30 PM";
NSArray *m = [regex matchesInString:str
                            options:0
                              range:NSMakeRange(0, str.length)];

答案 1 :(得分:5)

如果您知道时间间隔之前的文本始终采用<someday> thru <someday>格式,那么您可以找到第一个数字字符(数字)的索引,并从该索引中获取子字符串。

然后,使用@" - "方法在componentsSeparatedByString:上拆分时间字符串。

示例:

NSString *s = @"monday thru sunday, 0:00 - 23:59";

NSCharacterSet *digits = [NSCharacterSet decimalDigitCharacterSet];
int idx = [s rangeOfChatacterFromSet:digits].location;
NSString *timeStr = [s substringFromIndex:idx];

NSArray *timeStrings = [timeStr componentsSeparatedByString:@" - "];

答案 2 :(得分:0)

如何通过替换某些字符串的出现来先行。

因此请使用[string stringByReplacingOccurrencesOfString:@"Monday" withString: @""];

删除所有日期,可能是“直通”字符串。

然后你就离开了。别忘了留意太空人物。

希望这有帮助。