正在检测NSString是否包含……?


124

如何检测字符串中是否包含某个单词?例如,我下面有一个字符串,其内容为:

@"Here is my string."

我想知道是否可以检测到字符串中的单词,例如“ is”。



26
你可以接受答案吗?
Jacob Relkin'7年

如果假定字符串不包含标点,那么便宜的解决方案是在两个字符串的正面和背面连接空格,然后执行rangeOfString
热门点击

Answers:


192

这是我的处理方式:

NSString *someString = @"Here is my string";
NSRange isRange = [someString rangeOfString:@"is " options:NSCaseInsensitiveSearch];
if(isRange.location == 0) {
   //found it...
} else {
   NSRange isSpacedRange = [someString rangeOfString:@" is " options:NSCaseInsensitiveSearch];
   if(isSpacedRange.location != NSNotFound) {
      //found it...
   }
}

您可以轻松地将其作为类别添加到NSString

@interface NSString (JRStringAdditions) 

- (BOOL)containsString:(NSString *)string;
- (BOOL)containsString:(NSString *)string
               options:(NSStringCompareOptions)options;

@end

@implementation NSString (JRStringAdditions) 

- (BOOL)containsString:(NSString *)string
               options:(NSStringCompareOptions)options {
   NSRange rng = [self rangeOfString:string options:options];
   return rng.location != NSNotFound;
}

- (BOOL)containsString:(NSString *)string {
   return [self containsString:string options:0];
}

@end

2
实际上,您可以仅在字符串的开头和结尾添加空格,“ is”将匹配以“ is”开头的字符串
user4951 2012年

令我惊讶的是这些都不属于标准类。谢谢,@雅各布!
big_m

1
实际上,应该测试NSRange的“长度” ...而不是“位置”。这里直接来自源代码:“如果找不到目标字符串,这些方法将返回length == 0。因此,要检查是否包含:([ “ str rangeOfString:@” target“]。length> 0)。请注意,由于组成字符等原因,这些方法返回的范围长度可能与目标字符串的长度不同。”
GtotheB 2014年

从iOS 8.0开始containsString,NSString中公开了一个新方法。
tedyyu

89

使用以下代码扫描句子中的单词。

NSString *sentence = @"The quick brown fox";
NSString *word = @"quack";
if ([sentence rangeOfString:word].location != NSNotFound) {
    NSLog(@"Yes it does contain that word");
}

在数组上使用此方法时,如何获取位置?
2014年

取决于您要在数组中搜索的内容。我不使用比较器,我认为最好的方法是遍历数组并检查每个字符串中的搜索字符串。NSString * searchString; for(NSString *数组中的字符串){如果([[string rangeOfString:searchString options:NSCaseInsensitiveSearch] .location!= NSNotFound){//不在字符串中} else {//在此字符串中}}然后,您可以添加执行以下操作的字符串将其包含到一个新的可变数组中,使您可以在搜索时显示它们
simon_smiley 2014年

ps格式在上面的代码中都是正确的,但显然会因为注释而被捣碎
simon_smiley 2014年

22

在iOS8中,您现在可以使用:

BOOL containsString = [@"Here is my string." containsString:@"is"];

此处有一篇有趣的文章,介绍如何将其“改型”到iOS7:http ://petersteinberger.com/blog/2014/retrofitting-containsstring-on-ios-7/


这将是非常方便的方法。不幸的是,它没有文件记录,因此是私有API
Centurion

2
绝对不是私有API。签出NSString.h文件,您将看到它。
Brian Sachetta 2015年

3

我建议使用NSLinguisticTagger。我们可以用它来搜索Here is my string. His isn't a mississippi isthmus. It is?

NSLinguisticTagger *linguisticTagger = [[NSLinguisticTagger alloc] initWithTagSchemes:@[
                                        NSLinguisticTagSchemeTokenType,
                                        ]
                                                                              options:
                                        NSLinguisticTaggerOmitPunctuation |
                                        NSLinguisticTaggerOmitWhitespace |
                                        NSLinguisticTaggerOmitOther ];
[linguisticTagger setString:@"Here is my string. His isn't a mississippi isthmus. It is?"];
[linguisticTagger enumerateTagsInRange:NSMakeRange(0,
                                                   [[linguisticTagger string] length])
                                scheme:NSLinguisticTagSchemeTokenType
                               options:
 NSLinguisticTaggerOmitPunctuation |
 NSLinguisticTaggerOmitWhitespace |
 NSLinguisticTaggerOmitOther |
 NSLinguisticTaggerJoinNames
                            usingBlock:^(NSString *tag, NSRange tokenRange, NSRange sentenceRange, BOOL *stop) {
                                NSLog(@"tag: %@, tokenRange: %@, sentenceRange: %@, token: %@",
                                      tag,
                                      NSStringFromRange(tokenRange),
                                      NSStringFromRange(sentenceRange),
                                      [[linguisticTagger string] substringWithRange:tokenRange]);
                            }];

输出:

tag: Word, tokenRange: {0, 4}, sentenceRange: {0, 19}, token: Here
tag: Word, tokenRange: {5, 2}, sentenceRange: {0, 19}, token: is
tag: Word, tokenRange: {8, 2}, sentenceRange: {0, 19}, token: my
tag: Word, tokenRange: {11, 6}, sentenceRange: {0, 19}, token: string
tag: Word, tokenRange: {19, 3}, sentenceRange: {19, 33}, token: His
tag: Word, tokenRange: {23, 2}, sentenceRange: {19, 33}, token: is
tag: Word, tokenRange: {25, 3}, sentenceRange: {19, 33}, token: n't
tag: Word, tokenRange: {29, 1}, sentenceRange: {19, 33}, token: a
tag: Word, tokenRange: {31, 11}, sentenceRange: {19, 33}, token: mississippi
tag: Word, tokenRange: {43, 7}, sentenceRange: {19, 33}, token: isthmus
tag: Word, tokenRange: {52, 2}, sentenceRange: {52, 6}, token: It
tag: Word, tokenRange: {55, 2}, sentenceRange: {52, 6}, token: is

它忽略His mississippiisthmus甚至识别is的内部isn't


3

希望这对您有帮助。..在.m文件中添加此行或创建单独的类并集成此代码。

@implementation NSString (Contains)

- (BOOL) containsString: (NSString*) substring
{
NSRange range = [self rangeOfString : substring];
BOOL found = ( range.location != NSNotFound );
return found;
}    
@end

2

借助iOS 8和Swift,我们可以使用localizedCaseInsensitiveContainsString方法

 let string: NSString = "Café"
 let substring: NSString = "É"

 string.localizedCaseInsensitiveContainsString(substring) // true

0

完整的解决方案将首先扫描字符串(不添加空格),然后检查紧接的前一个字符是空白还是行首。同样,检查紧随其后的字符是空白还是行尾。如果两个测试都通过,那么您将匹配。根据你的需要,你可能还需要检查,.(),等。

当然,另一种方法是将字符串解析为单词,然后分别检查每个单词。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.