ตรวจสอบว่า NSString มี ... ?


124

ฉันจะตรวจสอบได้อย่างไรว่าสตริงมีคำบางคำ ตัวอย่างเช่นฉันมีสตริงด้านล่างซึ่งอ่านว่า:

@"Here is my string."

ฉันต้องการทราบว่าฉันสามารถตรวจพบคำในสตริงเช่น "is" ได้หรือไม่


อาจซ้ำกันของการค้นหา NSString Cocoa?
kennytm

26
คุณยอมรับคำตอบได้ไหม
Jacob Relkin

วิธีการแก้ปัญหาที่ถูกและสกปรกถ้าสตริงจะถือว่าไม่มีเครื่องหมายวรรคตอนคือการช่องว่าง concatenate rangeOfStringบนด้านหน้าและด้านหลังของสตริงทั้งสองแล้วทำ
Hot Licks

คำตอบ:


192

นี่คือวิธีที่ฉันจะทำ:

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

คุณสามารถเพิ่มสิ่งนี้เป็นหมวดหมู่ลงใน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
จริงๆแล้วคุณสามารถเพิ่มช่องว่างบนจุดเริ่มต้นและจุดสิ้นสุดของสตริงและ "is" จะจับคู่สตริงที่ขึ้นต้นด้วย "is"
user4951

ทำให้ฉันตกตะลึงว่าสิ่งเหล่านี้ไม่ใช่ส่วนหนึ่งของคลาสมาตรฐาน ขอบคุณ @Jacob!
big_m

1
อันที่จริงควรทดสอบ "ความยาว" ของ NSRange ... ไม่ใช่ "ตำแหน่ง" นี่คือโดยตรงจากแหล่งที่มา: "วิธีการเหล่านี้ส่งคืนความยาว == 0 หากไม่พบสตริงเป้าหมายดังนั้นเพื่อตรวจสอบการกักกัน: ([ str rangeOfString: @ "target"]. length> 0) โปรดทราบว่าความยาวของช่วงที่ส่งคืนโดยวิธีการเหล่านี้อาจแตกต่างจากความยาวของสตริงเป้าหมายอักขระที่ประกอบครบกำหนดและอื่น ๆ "
GtotheB

เริ่มตั้งแต่ iOS 8.0 มีวิธีการใหม่ที่เรียกว่าcontainsStringเปิดเผยใน NSString
tedyyu

89

ใช้รหัสต่อไปนี้เพื่อสแกนคำในประโยค

NSString *sentence = @"The quick brown fox";
NSString *word = @"quack";
if ([sentence rangeOfString:word].location != NSNotFound) {
    NSLog(@"Yes it does contain that word");
}

ฉันจะหาตำแหน่งได้อย่างไรเมื่อฉันใช้วิธีนี้กับอาร์เรย์
ตัดสิน

ขึ้นอยู่กับสิ่งที่คุณใช้ค้นหาในอาร์เรย์ หากไม่ใช้ตัวเปรียบเทียบฉันคิดว่าวิธีที่ดีที่สุดคือการวนรอบอาร์เรย์และตรวจสอบสตริงการค้นหาแต่ละสตริง NSString * searchString; สำหรับ (NSString * string ในอาร์เรย์) {if ([string rangeOfString: searchString options: NSCaseInsensitiveSearch] .location! = NSNotFound) {// Not in string} else {// In this string}} จากนั้นคุณสามารถเพิ่มสตริงที่ทำ รวมไว้ในอาร์เรย์ที่เปลี่ยนแปลงได้ใหม่ซึ่งช่วยให้คุณสามารถแสดงได้หากคุณกำลังค้นหา
simon_smiley

ps การจัดรูปแบบถูกต้องทั้งหมดในโค้ดด้านบน แต่เห็นได้ชัดว่าถูกบดบังด้วยการแสดงความคิดเห็น
simon_smiley

22

ใน iOS8 คุณสามารถใช้:

BOOL containsString = [@"Here is my string." containsString:@"is"];

มีโพสต์ที่น่าสนใจเกี่ยวกับวิธี "ติดตั้งเพิ่ม" ไปยัง iOS7 ที่นี่: http://petersteinberger.com/blog/2014/retrofitting-containsstring-on-ios-7/


มันจะเป็นวิธีที่ดีมาก น่าเสียดายที่ไม่มีการบันทึกไว้ดังนั้นจึงเป็น API ส่วนตัว
Centurion

2
ไม่ใช่ API ส่วนตัวอย่างแน่นอน ตรวจสอบไฟล์ NSString.h แล้วคุณจะเห็น
Brian Sachetta

3

ผมขอแนะนำให้ใช้NSLinguisticTagger เราสามารถใช้ในการค้นหาHere 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]);
                            }];

ผลลัพธ์นี้:

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

มันไม่สนใจHis mississippiและisthmusและระบุแม้กระทั่งภายในของisisn't


3

ฉันหวังว่านี่จะช่วยคุณได้, .. เพิ่มบรรทัดนี้ที่ไฟล์. m หรือสร้างคลาสแยกต่างหากและรวมโค้ดนี้

@implementation NSString (Contains)

- (BOOL) containsString: (NSString*) substring
{
NSRange range = [self rangeOfString : substring];
BOOL found = ( range.location != NSNotFound );
return found;
}    
@end

2

ด้วย iOS 8 และ Swift เราสามารถใช้เมธอด localizedCaseInsensitiveContainsString

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

 string.localizedCaseInsensitiveContainsString(substring) // true

0

วิธีแก้ปัญหาที่สมบูรณ์ก่อนอื่นจะสแกนหาสตริง (โดยไม่ต้องเพิ่มช่องว่าง) จากนั้นตรวจสอบว่าอักขระก่อนหน้านั้นว่างเปล่าหรือขึ้นต้นบรรทัด ในทำนองเดียวกันตรวจสอบว่าอักขระต่อไปนี้ว่างเปล่าหรือท้ายบรรทัด หากการทดสอบทั้งสองผ่านแสดงว่าคุณมีการแข่งขัน ทั้งนี้ขึ้นอยู่กับความต้องการของคุณคุณอาจตรวจสอบ,, ., ()ฯลฯ

อีกทางเลือกหนึ่งคือการแยกสตริงออกเป็นคำและตรวจสอบทีละคำ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.