【问题标题】:How properly extract substrings from an NSString without hardcoding positions?如何在没有硬编码位置的情况下正确地从 NSString 中提取子字符串?
【发布时间】:2013-07-24 17:14:04
【问题描述】:

我有这个字符串返回:

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

为了得到这个,我需要消除周一至周五的东西:

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

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

“8:00AM”&&“7:30PM”

但是有很多商店,他们有不同的开放和关闭时间,所以我不能从 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 的硬编码开始而中断,这让我想知道它是否会在其他任何地方中断。关于如何实现这一点有更好的想法吗?

【问题讨论】:

  • 使用正则表达式 - 参见例如NSRegularExpression 类。
  • 您可能的输入格式是什么?

标签: ios objective-c nsstring substring


【解决方案1】:

你可以使用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)];

【讨论】:

  • @H2CO3 我知道,我知道...这就是可可中的正则表达式 API 的方式。我希望我能用更少的行来写它。
  • @H2CO3 正则表达式擅长于此。 IMO 它们比您建议的定制代码更容易阅读和推理(假设时间之前没有数字,时间由破折号等分隔)。它特别指出“以 X:XX AM 或 X:XX PM 的形式查找内容”。
  • 我很失望,这得到了 6 个赞成票,而我漂亮而简单(和更早)的解决方案却没有得到任何...你们程序员把你们的审美放在哪里了感觉?
【解决方案2】:

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

然后,使用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:@" - "];

【讨论】:

  • 我认为您可以说“如果第一个数字始终是时间的开始”或类似的话,而不是“始终采用格式...”。
  • @MarcusAdams 好吧,从技术上讲,是的!
  • 这个数字很有趣。节省了大量的剪辑工作。即使时间不是 24 小时格式,这也会起作用吗?因为如果您注意到,例如它的“7:00 AM - 10:00 PM”。那么我将如何处理 AM 和 PM 呢?我应该将它们拆分然后剪掉每个字符的最后 3 个字符吗?
  • @marciokoko 是的,没错,但我认为你应该看看NSDateFormatter 或 C 标准库中的日期处理函数,以了解高级日期/时间字符串格式。
【解决方案3】:

先替换出现的一些字符串怎么样。

所以使用[string stringByReplacingOccurrencesOfString:@"Monday" withString: @""];

删除所有天数,可能还有“thru”字符串。

那么你就剩下几个小时了。不要忘记注意空格字符。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多