【问题标题】:Detect whole word in NSStrings检测 NSStrings 中的整个单词
【发布时间】:2013-11-05 09:01:44
【问题描述】:

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

如果 NSString 是Here is my string. His isn't a mississippi isthmus. It is...?该方法应该检测到单词is 并返回YES

但是,如果 NSString 是His isn't a mississipi isthmus,它应该返回NO

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

【问题讨论】:

  • 用空格包围搜索到的单词不会检测到最后一个是...

标签: ios objective-c nsstring


【解决方案1】:

使用“正则表达式”搜索与“单词边界模式”\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) { ... }

这也适用于"Is it?""It is!" 等单词没有被空格包围的情况。

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))
}

斯威夫特 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))
}

斯威夫特 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[range])
}

Swift 5(使用新的原始字符串文字):

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])
}

【讨论】:

    【解决方案2】:

    使用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) {//...}
    

    【讨论】:

      【解决方案3】:

      怎么样

      if ([text rangeOfString:@" is " options:NSCaseInsensitiveSearch].location != NSNotFound) { ... }
      

      【讨论】:

        【解决方案4】:

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

        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");
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-07-26
          • 2015-02-07
          • 2010-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-25
          相关资源
          最近更新 更多