ฉันจะตรวจสอบได้อย่างไรว่าสตริงมีคำบางคำ ตัวอย่างเช่นฉันมีสตริงด้านล่างซึ่งอ่านว่า:
@"Here is my string."
ฉันต้องการทราบว่าฉันสามารถตรวจพบคำในสตริงเช่น "is" ได้หรือไม่
rangeOfString
บนด้านหน้าและด้านหลังของสตริงทั้งสองแล้วทำ
ฉันจะตรวจสอบได้อย่างไรว่าสตริงมีคำบางคำ ตัวอย่างเช่นฉันมีสตริงด้านล่างซึ่งอ่านว่า:
@"Here is my string."
ฉันต้องการทราบว่าฉันสามารถตรวจพบคำในสตริงเช่น "is" ได้หรือไม่
rangeOfString
บนด้านหน้าและด้านหลังของสตริงทั้งสองแล้วทำ
คำตอบ:
นี่คือวิธีที่ฉันจะทำ:
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
containsString
เปิดเผยใน NSString
ใช้รหัสต่อไปนี้เพื่อสแกนคำในประโยค
NSString *sentence = @"The quick brown fox";
NSString *word = @"quack";
if ([sentence rangeOfString:word].location != NSNotFound) {
NSLog(@"Yes it does contain that word");
}
ใน iOS8 คุณสามารถใช้:
BOOL containsString = [@"Here is my string." containsString:@"is"];
มีโพสต์ที่น่าสนใจเกี่ยวกับวิธี "ติดตั้งเพิ่ม" ไปยัง iOS7 ที่นี่: http://petersteinberger.com/blog/2014/retrofitting-containsstring-on-ios-7/
ผมขอแนะนำให้ใช้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
และระบุแม้กระทั่งภายในของis
isn't
ฉันหวังว่านี่จะช่วยคุณได้, .. เพิ่มบรรทัดนี้ที่ไฟล์. m หรือสร้างคลาสแยกต่างหากและรวมโค้ดนี้
@implementation NSString (Contains)
- (BOOL) containsString: (NSString*) substring
{
NSRange range = [self rangeOfString : substring];
BOOL found = ( range.location != NSNotFound );
return found;
}
@end
ด้วย iOS 8 และ Swift เราสามารถใช้เมธอด localizedCaseInsensitiveContainsString
let string: NSString = "Café"
let substring: NSString = "É"
string.localizedCaseInsensitiveContainsString(substring) // true
วิธีแก้ปัญหาที่สมบูรณ์ก่อนอื่นจะสแกนหาสตริง (โดยไม่ต้องเพิ่มช่องว่าง) จากนั้นตรวจสอบว่าอักขระก่อนหน้านั้นว่างเปล่าหรือขึ้นต้นบรรทัด ในทำนองเดียวกันตรวจสอบว่าอักขระต่อไปนี้ว่างเปล่าหรือท้ายบรรทัด หากการทดสอบทั้งสองผ่านแสดงว่าคุณมีการแข่งขัน ทั้งนี้ขึ้นอยู่กับความต้องการของคุณคุณอาจตรวจสอบ,
, .
, ()
ฯลฯ
อีกทางเลือกหนึ่งคือการแยกสตริงออกเป็นคำและตรวจสอบทีละคำ