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

mar*_*oko 1 substring objective-c nsstring ios

我有这个字符串返回:

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

为了得到这个,我需要消除mon-fri的东西:

"上午8:00 - 晚上7:30"

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

"上午8:00"&&"晚上7:30"

但是有很多商店,他们有不同的开放和关闭时间,所以我不能从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))];
Run Code Online (Sandbox Code Playgroud)

但似乎我可能会因为16岁的硬编码而破裂,这让我想知道它是否会在其他地方破坏.有关如何实现这一目标的更好的想法?

das*_*ght 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)];
Run Code Online (Sandbox Code Playgroud)


小智 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:@" - "];
Run Code Online (Sandbox Code Playgroud)