【问题标题】:Getting the last word of an NSString获取 NSString 的最后一个单词
【发布时间】:2012-06-15 14:31:02
【问题描述】:

正如标题所示,我想从 NSString 中取出最后一个字。 我想使用这段代码:

NSArray *listItems = [someNSStringHere componentsSeparatedByString:@" "];
NSString *lastWordString = [NSString stringWithFormat:@"%@", listItems.lastObject];
anotherNSStringHere = lastWordString;

但我认为如果 NSArray 很大(而且很大),加载它需要一些时间,并且它无法识别以逗号分隔的单词。

感谢您的帮助!

【问题讨论】:

    标签: objective-c ios


    【解决方案1】:

    如果你想变得超级健壮:

    __block NSString *lastWord = nil;
    
    [someNSStringHere enumerateSubstringsInRange:NSMakeRange(0, [someNSStringHere length]) options:NSStringEnumerationByWords | NSStringEnumerationReverse usingBlock:^(NSString *substring, NSRange subrange, NSRange enclosingRange, BOOL *stop) {
        lastWord = substring;
        *stop = YES;
    }];
    

    (这也适用于非罗马语言;iOS 4+/OS X 10.6+。)

    基本解释:

    -enumerateSubstringsInRage:options:usingBlock: 就像它在锡上所说的那样:它枚举子字符串,这些子字符串由您作为选项传入的内容定义。 NSStringEnumerationByWords 说“我想要给我的话”,NSStringEnumerationReverse 说“从字符串的末尾而不是开头开始”。

    由于我们从末尾开始,substring 中给我们的第一个单词将是字符串中的最后一个单词,因此我们将 lastWord 设置为那个,然后将 BOOL 指向stop 为 YES,因此枚举立即停止。

    lastWord 当然定义为__block,所以我们可以将它设置在块内并在块外看到它,它被初始化为nil,所以如果字符串 没有 没有单词(例如, 如果它是空的或全是标点符号) 我们在尝试使用lastWord 时不会崩溃。

    【讨论】:

    • 非常感谢您的解释!
    • 不错的解决方案。如果您想要超级健壮,请添加NSStringEnumerationLocalized 选项(考虑当前用户区域设置以进行分词)。 ;-)
    【解决方案2】:

    试试这个:

    NSRange range = [someNSStringHere rangeOfString:@" " options:NSBackwardsSearch];
    NSString *result = [someNSStringHere substringFromIndex:range.location+1];
    

    【讨论】:

    • 我同意。从末尾开始,一次一个字符,直到到达空格、逗号或任何其他您可以预见的分隔符。
    • 如果未找到@" ",您可能希望使用完整的字符串。我会这样做:NSRange range = [someString rangeOfString:@" " options:NSBackwardsSearch]; NSString *lastWord = someString; if (range.location != NSNotFound) { lastWord = [self substringFromIndex:range.location+1]; }.
    【解决方案3】:

    如果您想使用正则表达式(如果您想在字符串结尾处查找的内容变得更加复杂,这可能很有用),您可以执行以下操作:

    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\S+\\Z" options:0 error:nil];
    NSTextCheckingResult *found = [regex firstMatchInString:inputString options:0 range:NSMakeRange(0, [inputString length])];
    
    if (found.range.location != NSNotFound)
        result = [inputString substringWithRange:found.range];
    

    【讨论】:

      【解决方案4】:

      这很好用,因为它还可以识别 @ 和 # 之类的符号,而 enumerateSubstringsInRange: 不支持。

      NSCharacterSet *charSet = [NSCharacterSet whitespaceAndNewlineCharacterSet];
      NSArray *components = [someString componentsSeparatedByCharactersInSet:charSet];
      NSString *lastWord = components.lastObject;
      

      【讨论】:

        【解决方案5】:

        最有效的方法可能是从字符串的末尾开始,检查每个字符以查看它是否是您定义的单词的一部分,然后使用substringFromIndex:substringWithRange: 提取您想要的单词。

        【讨论】:

          【解决方案6】:

          您可以从字符串末尾读取符号并将它们复制到 0 索引到结果字符串。无论您阅读空格还是逗号,结果字符串都将包含最后一个单词

          【讨论】:

            【解决方案7】:

            您可以使用NSString 的函数rangeOfSubstring:options: 来确定它。例如:

            在字符串中搜索空格,使用向后搜索选项从字符串末尾开始搜索。

            NSRange r = [string rangeOfString:@" " options:NSBackwardsSearch];

            这将找到字符串最后一个单词的位置。现在只需使用substringWithRange: 获取字符串例如:

            NSRange found = NSMakeRange(NSMaxRange(r), string.length - NSMaxRange(r)); NSString *foundString = [string substringWithRange:found];

            其中r 是之前的范围。

            还要小心确保您检查r 确实存在。如果字符串中只有 1 个单词,则 r 将是 {NSNotFound, 0}

            希望我能帮上忙!

            【讨论】:

              猜你喜欢
              • 2021-04-29
              • 2013-11-25
              • 1970-01-01
              • 2013-09-07
              • 2015-09-08
              • 2011-09-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多