在属性字符串中查找确切单词的方法

时间:2013-07-16 20:46:58

标签: objective-c nsstring nsattributedstring nsrange

我正在寻找一种可以在字符串中找到特定单词的Objective-C方法。我正在使用:

- (NSRange)rangeOfString:(NSString *)aString

但它并没有完全符合我的要求。原因是我更多地寻找令牌匹配而不是找到这个词本身。我正在使用属性字符串,我需要字符串的特定部分来拥有属性。需要属性的部分必须等于对象的内容。我遇到的问题是,如果我有一个内容为'star'的对象,但'stars'一词也在字符串中,则range方法将返回'star'的范围并离开s而不是确定字符串中是否存在确切的单词“star”。

我不确定这种方法是否存在,但我非常感谢任何帮助!如果您需要任何其他说明,请告诉我们!

编辑: 为了帮助我一点点,我会告诉你我的具体情况:

我有一张与3张牌匹配的纸牌游戏。对于这个例子,假设卡上有一个■。没有两张牌是一样的。按“■■”,“■■■”和“■■”等顺序选择卡片会导致问题。就像我说的那样,内容需要归结。问题是,因为有2张卡上有“■■”,另一张带有“■■■”,所以属性放在第一个'■■'罚款,但随后'■■'卡被放置在它的前2个方格上带有'■''牌属性,最后的'■''牌永远不会放在它上面。所以问题在于它找到了'■■'的第一个子串,即使它是一个更大的单词。我需要它只查看字符串中与内容完全匹配的单词/标记。

2 个答案:

答案 0 :(得分:1)

似乎是正则表达式的可行任务(非常罕见的鸟!):

NSRange token = [string rangeOfString:@"\\bstar\\b" options:NSRegularExpressionSearch];

答案 1 :(得分:0)

您可以使用[attributedString string]将属性字符串转换为常规字符串,然后照常使用NSStringEnumerationByWords。例如,给定......星星......明星......它应该返回星星而不是星星。

[[s string] enumerateSubstringsInRange:NSMakeRange(0, [s length])
                      options:NSStringEnumerationByWords
                   usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
    if ([substring isEqualToString:@"star"]){
       NSLog(@"%@", substring);
       *stop = YES;
    }
}];

(不确定我是否正确理解了您的卡片示例)