Phát hiện nếu một NSString có chứa?


124

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.


có thể trùng lặp với Tìm kiếm NSString Ca cao?
kennytm

26
bạn có thể chấp nhận một câu trả lời?
Jacob Relkin

Một giải pháp rẻ tiền và bẩn, nếu chuỗi được giả sử không chứa dấu chấm câu, là ghép các khoảng trống ở mặt trước và mặt sau của chuỗi BÓNG, sau đó làm rangeOfString.
Licks nóng

Câu trả lời:


192

Đâ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

2
Trên thực tế, bạn chỉ có thể thêm khoảng
trắng

Nó làm tôi choáng váng rằng đây không phải là một phần của lớp tiêu chuẩn. Cảm ơn, @Jacob!
big_m

1
Trên thực tế, "độ dài" của NSRange nên được kiểm tra ... không phải "vị trí". Đây là trực tiếp từ nguồn: "Các phương thức này trả về độ dài == 0 nếu không tìm thấy chuỗi mục tiêu. Vì vậy, để kiểm tra ngăn chặn: ([ str RangeOfString: @ "target"]. length> 0). Lưu ý rằng độ dài của phạm vi được trả về bởi các phương thức này có thể khác với độ dài của chuỗi mục tiêu, do các ký tự hợp thành và như vậy. "
GtotheB

Bắt đầu từ iOS 8.0, có một phương pháp mới được gọi là containsStringphơi bày trong NSString.
tedyyu

89

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

Làm thế nào tôi có thể nhận được các vị trí khi tôi sử dụng phương pháp này trên một mảng?
thẩm phán

Phụ thuộc vào những gì bạn đang sử dụng tìm kiếm trong mảng. Không sử dụng bộ so sánh tôi nghĩ cách tốt nhất là lặp qua mảng và kiểm tra từng chuỗi cho chuỗi tìm kiếm. NSString * searchString; for (NSString * chuỗi trong mảng) {if ([chuỗi RangeOfString: searchString tùy chọn: NSCaseInsensitiveSearch] .location! = NSNotFound) {// Không phải trong chuỗi} khác {// Trong chuỗi này}} Sau đó, bạn có thể thêm chuỗi chứa nó vào một mảng có thể thay đổi mới cho phép bạn hiển thị chúng nếu bạn đang tìm kiếm
simon_smiley

ps Định dạng hoàn toàn chính xác trong đoạn mã trên nhưng rõ ràng bị nghiền nát bởi trong một bình luận
simon_smiley

22

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/


Nó sẽ là phương pháp tiện dụng rất tốt đẹp. Thật không may, nó không được ghi lại và do đó là API riêng
Centurion

2
Nó chắc chắn không phải là API riêng tư. Kiểm tra tệp NSString.h và bạn sẽ thấy nó.
Brian Sachetta

3

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 mississippiisthmusthậm chí xác định isbên trong isn't.


3

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

2

Với iOS 8 và Swift, chúng ta có thể sử dụng phương thức localizedCaseInsensitiveContainsString

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

 string.localizedCaseInsensitiveContainsString(substring) // true

0

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ẻ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.