8

正如标题所暗示的,我想从 NSString 中得到最后一句话。我想使用这段代码:

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

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

感谢您的帮助!

4

7 回答 7

29

如果你想变得超级健壮:

__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说“从字符串的末尾而不是开头开始”。

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

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

于 2012-06-15T14:52:24.680 回答
12

试试这个:

NSRange range = [someNSStringHere rangeOfString:@" " options:NSBackwardsSearch];
NSString *result = [someNSStringHere substringFromIndex:range.location+1];
于 2012-06-15T14:41:01.480 回答
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];
于 2012-06-15T15:32:23.207 回答
3

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

NSCharacterSet *charSet = [NSCharacterSet whitespaceAndNewlineCharacterSet];
NSArray *components = [someString componentsSeparatedByCharactersInSet:charSet];
NSString *lastWord = components.lastObject;
于 2014-04-03T19:55:14.593 回答
1

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

于 2012-06-15T14:36:44.263 回答
0

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

于 2012-06-15T14:34:27.010 回答
0

您可以使用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确实存在。r如果字符串中只有 1 个单词,则为{NSNotFound, 0}

希望我能帮上忙!

于 2012-06-15T14:44:38.637 回答