Làm thế nào tôi có thể phát hiện nếu một chuỗi chứa một từ nhất định? Ví dụ, tôi có một chuỗi bên dưới có nội dung:
@"Here is my string."
Tôi muốn biết nếu tôi có thể phát hiện một từ trong chuỗi, chẳng hạn như "là" chẳng hạn.
rangeOfString
.
Làm thế nào tôi có thể phát hiện nếu một chuỗi chứa một từ nhất định? Ví dụ, tôi có một chuỗi bên dưới có nội dung:
@"Here is my string."
Tôi muốn biết nếu tôi có thể phát hiện một từ trong chuỗi, chẳng hạn như "là" chẳng hạn.
rangeOfString
.
Câu trả lời:
Đây là cách tôi sẽ làm điều đó:
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...
}
}
Bạn có thể dễ dàng thêm nó dưới dạng một danh mục vào 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
containsString
phơi bày trong NSString.
Sử dụng đoạn mã sau để quét từ trong câu.
NSString *sentence = @"The quick brown fox";
NSString *word = @"quack";
if ([sentence rangeOfString:word].location != NSNotFound) {
NSLog(@"Yes it does contain that word");
}
Trong iOS8 bây giờ bạn có thể sử dụng:
BOOL containsString = [@"Here is my string." containsString:@"is"];
Có một bài viết thú vị về cách "trang bị thêm" cho iOS7 tại đây: http://petersteinberger.com/blog/2014/retrofmit-containsopes-on-ios-7/
Tôi khuyên bạn nên sử dụng NSLinguisticTagger . Chúng ta có thể sử dụng nó để tìm kiếmHere 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]);
}];
Kết quả này:
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
Nó bỏ qua His
mississippi
và isthmus
thậm chí xác định is
bên trong isn't
.
Tôi hy vọng điều này sẽ giúp bạn, .. thêm dòng này vào tệp .m hoặc tạo một lớp riêng và tích hợp mã này.
@implementation NSString (Contains)
- (BOOL) containsString: (NSString*) substring
{
NSRange range = [self rangeOfString : substring];
BOOL found = ( range.location != NSNotFound );
return found;
}
@end
Một giải pháp hoàn chỉnh trước tiên sẽ quét chuỗi (không thêm khoảng trắng), sau đó kiểm tra xem ký tự trước đó có trống hay bắt đầu dòng không. Tương tự kiểm tra xem ký tự ngay sau đây có trống hay cuối dòng không. Nếu cả hai bài kiểm tra vượt qua thì bạn có một trận đấu. Tùy thuộc vào nhu cầu của bạn, bạn cũng có thể kiểm tra ,
, .
, ()
vv
Tất nhiên, một cách tiếp cận khác là phân tích chuỗi thành các từ và kiểm tra từng từ riêng lẻ.