检测NSString中的整个单词
如何检测一个NSString是否包含一个特定的单词,例如is
。
如果NSString是Here is my string. His isn't a mississippi isthmus. It is...
Here is my string. His isn't a mississippi isthmus. It is...
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) { ... }
但它检测字符而不是单词。
使用“正则expression式”search与“单词边界模式” \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)) }
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)) }
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[range]) }
使用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) {//...}
关于什么
if ([text rangeOfString:@" is " options:NSCaseInsensitiveSearch].location != NSNotFound) { ... }
您可以按照build议使用正则expression式,也可以在语言上分析单词:
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");