Ios 检测字符串中的整个单词

Ios 检测字符串中的整个单词,ios,objective-c,nsstring,Ios,Objective C,Nsstring,如何检测NSString是否包含特定单词,例如is 如果NSString是,这里是我的字符串。他不是密西西比地峡。它是…?该方法应检测单词为,并返回是 但是,如果NSString是His不是密西西比地峡,它应该返回NO 我尝试使用if([text rangeOfString:@“is”options:NSCaseInsensitiveSearch].location!=NSNotFound){…}但它检测的是字符而不是单词。怎么办 if ([text rangeOfString:@" is "

如何检测NSString是否包含特定单词,例如
is

如果NSString是
,这里是我的字符串。他不是密西西比地峡。它是…
?该方法应检测单词
,并返回

但是,如果NSString是
His不是密西西比地峡
,它应该返回
NO

我尝试使用
if([text rangeOfString:@“is”options:NSCaseInsensitiveSearch].location!=NSNotFound){…}
但它检测的是字符而不是单词。

怎么办

if ([text rangeOfString:@" is " options:NSCaseInsensitiveSearch].location != NSNotFound) { ... }
使用“正则表达式”搜索“单词边界模式”
\b

NSString *text = @"Here is my string. His isn't a mississippi isthmus. It is...";
NSString *pattern = @"\\bis\\b";
NSRange range = [text rangeOfString:pattern options:NSRegularExpressionSearch|NSCaseInsensitiveSearch];
if (range.location != NSNotFound) { ... }
这也适用于
“是吗?”
“是吗!”
,其中单词不被空格包围

在Swift 2中,这将是

let text = "Here is my string. His isn't a mississippi isthmus. It is..."
let pattern = "\\bis\\b"
if let range = text.rangeOfString(pattern, options: [.RegularExpressionSearch, .CaseInsensitiveSearch]) {
    print ("found:", text.substringWithRange(range))
}
Swift 3:

let text = "Here is my string. His isn't a mississippi isthmus. It is..."
let pattern = "\\bis\\b"
if let range = text.range(of: pattern, options: [.regularExpression, .caseInsensitive]) {
    print ("found:", text.substring(with: range))
}
let text = "Here is my string. His isn't a mississippi isthmus. It is..."
let pattern = "\\bis\\b"
if let range = text.range(of: pattern, options: [.regularExpression, .caseInsensitive]) {
    print ("found:", text[range])
}
Swift 4:

let text = "Here is my string. His isn't a mississippi isthmus. It is..."
let pattern = "\\bis\\b"
if let range = text.range(of: pattern, options: [.regularExpression, .caseInsensitive]) {
    print ("found:", text.substring(with: range))
}
let text = "Here is my string. His isn't a mississippi isthmus. It is..."
let pattern = "\\bis\\b"
if let range = text.range(of: pattern, options: [.regularExpression, .caseInsensitive]) {
    print ("found:", text[range])
}
Swift 5(使用新的原始字符串文字):


NSRegularExpressionSearch
选项与
\b
一起使用,以匹配单词边界字符

像这样:

NSString *string = @"Here is my string. His isn't a mississippi isthmus. It is...";
if(NSNotFound != [string rangeOfString:@"\\bis\\b" options:NSRegularExpressionSearch].location) {//...}

您可以按照建议使用正则表达式,也可以从语言学角度分析单词:

NSString *string = @"Here is my string. His isn't a mississippi isthmus. It is...";
__block BOOL containsIs = NO;
[string enumerateLinguisticTagsInRange:NSMakeRange(0, [string length]) scheme:NSLinguisticTagSchemeTokenType options:NSLinguisticTaggerOmitPunctuation | NSLinguisticTaggerOmitWhitespace | NSLinguisticTaggerOmitOther orthography:nil usingBlock:^(NSString *tag, NSRange tokenRange, NSRange sentenceRange, BOOL *stop){
    NSString *substring = [string substringWithRange:tokenRange];
    if (containsIs)
        if ([substring isEqualToString:@"n't"])
            containsIs = NO; // special case because "isn't" are actually two separate words
        else
            *stop = YES;
    else
        containsIs = [substring isEqualToString:@"is"];
}];
NSLog(@"'%@' contains 'is': %@", string, containsIs ? @"YES" : @"NO");

用空格包围搜索的单词将无法检测最后一个是。。。