ฉันจะตรวจสอบว่าสตริงมีสตริงอื่นใน Objective-C ได้อย่างไร?


1212

ฉันจะตรวจสอบว่าสตริง ( NSString) มีสตริงอื่นที่เล็กกว่าได้อย่างไร?

ฉันหวังว่าจะชอบ:

NSString *string = @"hello bla bla";
NSLog(@"%d",[string containsSubstring:@"hello"]);

แต่สิ่งที่ฉันพบได้ใกล้ที่สุดคือ:

if ([string rangeOfString:@"hello"] == 0) {
    NSLog(@"sub string doesnt exist");
} 
else {
    NSLog(@"exists");
}

อย่างไรก็ตามเป็นวิธีที่ดีที่สุดในการค้นหาว่าสตริงมีสตริงอื่นหรือไม่


1
ฉันต้องการที่จะเห็นมันเพิ่มเช่นกัน แต่ในขณะเดียวกันมันค่อนข้างง่ายที่จะเพิ่มเป็นหมวดหมู่ใน NSString
isaac

2
การใช้งานif ([string rangeOfString:@"hello"] == 0) {...}มีข้อผิดพลาดชนิดไม่ตรงกันสำหรับ NSRange และ int เพื่อแก้ไขปัญหานี้คุณควรเปลี่ยนบรรทัดดังต่อไปนี้:if ([string rangeOfString:@"hello"].length == 0) {...}
Neeku

1
iOS 8 เพิ่มcontainString
Steve Moser

2
ฉันเป็นนักพัฒนา iOS ตั้งแต่เริ่มต้นและฉันกลับมาโพสต์นี้อีกครั้งเพื่อคัดลอกอย่างรวดเร็ว ฉันไม่สามารถจำสิ่งนี้ได้ การโพสต์สแต็คโอเวอร์โฟลว์ที่เข้าชมบ่อยที่สุดในประวัติของฉัน
VaporwareWolf

เพียงใช้ Swift;)
Fattie

คำตอบ:


2436
NSString *string = @"hello bla bla";
if ([string rangeOfString:@"bla"].location == NSNotFound) {
  NSLog(@"string does not contain bla");
} else {
  NSLog(@"string contains bla!");
}

ที่สำคัญคือการสังเกตเห็นว่าrangeOfString:ส่งกลับNSRangestruct และเอกสารบอกว่ามันจะส่งกลับ struct {NSNotFound, 0}ถ้า "กองหญ้า" ไม่ได้มี "เข็ม"


และถ้าคุณใช้ iOS 8 หรือ OS X Yosemite ตอนนี้คุณสามารถทำได้: (* หมายเหตุ: แอปนี้จะชนแอปของคุณหากรหัสนี้ถูกเรียกบนอุปกรณ์ iOS7)

NSString *string = @"hello bla blah";
if ([string containsString:@"bla"]) {
  NSLog(@"string contains bla!");
} else {
  NSLog(@"string does not contain bla");
}

(นี่คือวิธีการทำงานใน Swift ด้วย)

👍


286
ในการทำให้การค้นหาแบบตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ใช้ "if (ตัวเลือก [range rangeOfString: @" bla ": NSCaseInsensitiveSearch] .location! = NSNotFound)"
Vanja

1
@Dave DeLong ฉันเพิ่งจะพูดถึงหมวดหมู่ที่ฉันสร้างขึ้นเพื่อจุดประสงค์นี้ก่อนที่ฉันจะอ่านคำตอบของคุณแก้ไข! เนื่องจากฉันเป็นนักพัฒนา # AC ฉันดีใจที่พวกเขาเพิ่มวิธีการที่มีไปยัง NSSTring
dherrin79

ทำไมคอมไพเลอร์ไม่พูดอะไรถ้าเป้าหมายการปรับใช้ของฉันคือ iOS7 และฉันใช้ containString
Ricardo

3
และเพื่อเพิ่มเติมจุดที่ทำโดย @Vanja: หากคุณจะใช้รหัสทางลัด [string containString] ที่ถูกนำมาใช้ใน iOS 8 / Yosemite คุณสามารถใช้รหัสต่อไปนี้สำหรับสตริงที่ไม่สนใจตัวพิมพ์เล็กและตัวพิมพ์ใหญ่: "[stringToSearch localizedCaseInsensitiveContainsString: สตริง ] "และอันนี้ถ้าคุณต้องการค้นหาเคสและการค้นหาแบบไวอะซิติค:" [stringToSearch localizedStandardContainsString: string] "
Scott Kohlert

1
โปรดทราบว่าการแสดงออก[string rangeOfString:@"bla"].location != NSNotFoundจะเป็นจริงเมื่อสตริงเป็นnil!
funroll

158

สำหรับ iOS 8.0+ และ macOS 10.10+ คุณสามารถใช้เนทิสของ NSString containsString:ได้

สำหรับ iOS และ macOS เวอร์ชันเก่ากว่าคุณสามารถสร้างหมวดหมู่ (ล้าสมัย) ของคุณเองสำหรับ NSString:

@interface NSString ( SubstringSearch )
    - (BOOL)containsString:(NSString *)substring;
@end

// - - - - 

@implementation NSString ( SubstringSearch )

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

@end

หมายเหตุ: สังเกตความคิดเห็นของ Daniel Galasko ด้านล่างเกี่ยวกับการตั้งชื่อ


13
+1 สำหรับโค้ดที่ชัดเจนกว่าและการใช้ซ้ำ ฉันเปลี่ยนเป็นหนึ่งซับreturn [self rangeOfString:substring].location != NSNotFound;และรวมไว้ในห้องสมุด refactoring ของฉัน es_ios_utils github.com/peterdeweese/es_ios_utils
Peter DeWeese

4
ดูเหมือนว่า Apple จะชอบไอเดียของคุณและเพิ่มฟีเจอร์นี้ใน iOS 8 และ OSx 10.10 (Yosemite) ตามที่ @DaveDeLong พูดถึงในคำตอบของเขา +1
อิสลาม Q.

7
กฎสำคัญสำหรับหมวดหมู่ obj-c คือการใส่ชื่อวิธีด้วยคำนำหน้าโมดูลตัวอักษร 3 ตัวของคุณ นี่เป็นตัวอย่างที่สมบูรณ์แบบเนื่องจากตอนนี้ขัดแย้งกับการวางจำหน่าย iOS 7 และ 10.10
Daniel Galasko

54

เนื่องจากนี่เป็นผลการจัดอันดับสูงใน Google ฉันต้องการเพิ่มสิ่งนี้:

iOS 8 และ OS X 10.10 เพิ่มวิธีการในการcontainsString: NSStringตัวอย่างของ Dave DeLong รุ่นปรับปรุงสำหรับระบบเหล่านั้น:

NSString *string = @"hello bla bla";
if ([string containsString:@"bla"]) {
    NSLog(@"string contains bla!");
} else {
    NSLog(@"string does not contain bla");
}

39
NSString *myString = @"hello bla bla";
NSRange rangeValue = [myString rangeOfString:@"hello" options:NSCaseInsensitiveSearch];

if (rangeValue.length > 0)
{
    NSLog(@"string contains hello");
} 
else 
{
    NSLog(@"string does not contain hello!");
}

// คุณสามารถใช้สิ่งต่อไปนี้เช่นกัน:

if (rangeValue.location == NSNotFound) 
{
    NSLog(@"string does not contain hello");
} 
else 
{
    NSLog(@"string contains hello!");
}

22

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

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

 string.localizedCaseInsensitiveContainsString(substring) // true

1
ดีจัง. ไม่รู้เลยว่าทำไมพวกเขาถึงไม่มีวิธีนี้สำหรับ iOS 7
Lucas

@Lucas เนื่องจาก Swift เปิดตัวด้วย iOS 8.0 แต่ด้วยความรวดเร็วคุณยังสามารถรองรับอุปกรณ์ที่ใช้ iOS 7 ได้
Hemang

13

โดยส่วนตัวแล้วฉันเกลียดจริง ๆNSNotFoundแต่เข้าใจความจำเป็น

แต่บางคนอาจไม่เข้าใจความซับซ้อนของการเปรียบเทียบกับ NSNotFound

ตัวอย่างเช่นรหัสนี้:

- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
    if([string rangeOfString:otherString].location != NSNotFound)
        return YES;
    else
        return NO;
}

มีปัญหา:

1) ชัดเจนว่าotherString = nilรหัสนี้จะผิดพลาด การทดสอบอย่างง่ายจะเป็น:

NSLog(@"does string contain string - %@", [self doesString:@"hey" containString:nil] ? @"YES": @"NO");

ผลลัพธ์ใน !! ผิดพลาด !!

2) สิ่งที่ไม่ชัดเจนสำหรับบางคนที่เพิ่งรู้จักกับ object-c คือรหัสเดียวกันจะไม่ผิดพลาดเมื่อstring = nilใด ตัวอย่างเช่นรหัสนี้:

NSLog(@"does string contain string - %@", [self doesString:nil containString:@"hey"] ? @"YES": @"NO");

และรหัสนี้:

NSLog(@"does string contain string - %@", [self doesString:nil containString:nil] ? @"YES": @"NO");

จะส่งผลให้ทั้งคู่

does string contains string - YES

ซึ่งเห็นได้ชัดว่าไม่ใช่สิ่งที่คุณต้องการ

ดังนั้นทางออกที่ดีกว่าที่ฉันเชื่อว่าใช้งานได้คือการใช้ความจริงที่ rangeOfString ส่งคืนความยาวเป็น 0 ดังนั้นรหัสที่น่าเชื่อถือมากขึ้นก็คือ

- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
    if(otherString && [string rangeOfString:otherString].length)
        return YES;
    else
        return NO;
}

หรือ SIMPLY:

- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
    return (otherString && [string rangeOfString:otherString].length);
}

ซึ่งจะสำหรับกรณีที่ 1 และ 2 จะกลับมา

does string contains string - NO

นั่นคือ 2 เซ็นต์ของฉัน ;-)

โปรดตรวจสอบGistของฉันเพื่อรับรหัสที่เป็นประโยชน์เพิ่มเติม


12

รุ่นที่ปรับปรุงแล้วของโซลูชันP iซึ่งเป็นหมวดหมู่ใน NSString ซึ่งไม่เพียง แต่จะบอกได้ว่าหากพบสตริงในสตริงอื่น แต่ยังใช้ช่วงโดยอ้างอิงคือ:

@interface NSString (Contains)
-(BOOL)containsString: (NSString*)substring
              atRange:(NSRange*)range;

-(BOOL)containsString:(NSString *)substring;
@end

@implementation NSString (Contains)

-(BOOL)containsString:(NSString *)substring
              atRange:(NSRange *)range{

    NSRange r = [self rangeOfString : substring];
    BOOL found = ( r.location != NSNotFound );
    if (range != NULL) *range = r;
    return found;
}

-(BOOL)containsString:(NSString *)substring
{
    return [self containsString:substring
                        atRange:NULL];
}

@end

ใช้มันเหมือน:

NSString *string = @"Hello, World!";

//If you only want to ensure a string contains a certain substring
if ([string containsString:@"ello" atRange:NULL]) {
    NSLog(@"YES");
}

// Or simply
if ([string containsString:@"ello"]) {
    NSLog(@"YES");
}

//If you also want to know substring's range
NSRange range;
if ([string containsString:@"ello" atRange:&range]) {
    NSLog(@"%@", NSStringFromRange(range));
}

8

นี่คือตัวอย่างฟังก์ชั่นการคัดลอกและวาง:

-(BOOL)Contains:(NSString *)StrSearchTerm on:(NSString *)StrText
{
    return [StrText rangeOfString:StrSearchTerm 
        options:NSCaseInsensitiveSearch].location != NSNotFound;
}

ฉันขอทราบได้ไหมว่าทำไมฉันถึงถูกลดระดับลง? มันเป็นข้อมูลโค้ดที่ใช้งานได้
Durai Amuthan.H

6

Oneliner (โค้ดมีจำนวนน้อยกว่า DRY เนื่องจากคุณมีเพียงรหัสเดียวNSLog):

NSString *string = @"hello bla bla";
NSLog(@"String %@", ([string rangeOfString:@"bla"].location == NSNotFound) ? @"not found" : @"cotains bla"); 

6
NSString *categoryString = @"Holiday Event";
if([categoryString rangeOfString:@"Holiday"].location == NSNotFound)
{
    //categoryString does not contains Holiday
}
else
{
    //categoryString contains Holiday
}

5

ลองนี้

NSString *string = @"test Data";
if ([[string lowercaseString] rangeOfString:@"data"].location == NSNotFound) 
{
    NSLog(@"string does not contain Data");
}   
else 
{
    NSLog(@"string contains data!");
}

5

ทางออกที่ดีที่สุด ง่ายเหมือนนี้! หากคุณต้องการหาคำหรือส่วนหนึ่งของสตริง คุณสามารถใช้รหัสนี้ ในตัวอย่างนี้เราจะตรวจสอบว่าคุณค่าของคำมี "นักกระทำ"

NSString *word =@"find a word or character here";
if ([word containsString:@"acter"]){
    NSLog(@"It contains acter");
} else {
     NSLog (@"It does not contain acter");
}


4

หากคุณต้องการสิ่งนี้ครั้งเดียวเขียน:

NSString *stringToSearchThrough = @"-rangeOfString method finds and returns the range of the first occurrence of a given string within the receiver.";
BOOL contains = [stringToSearchThrough rangeOfString:@"occurence of a given string"].location != NSNotFound;

4

ในกรณีที่รวดเร็วสามารถใช้

let string = "Package #23"
if string.containsString("Package #") {
    //String contains substring
}
else {
    //String does not contain substring
}

2

ถ้าไม่สนใจเกี่ยวกับสตริง ลองครั้งเดียว

NSString *string  = @"Hello World!";

if([string rangeOfString:@"hello" options:NSCaseInsensitiveSearch].location !=NSNotFound)
{
    NSLog(@"found");
}
else
{
    NSLog(@"not found");
}

1

กรุณาใช้รหัสนี้

NSString *string = @"hello bla bla";
if ([string rangeOfString:@"bla"].location == NSNotFound) 
{
    NSLog(@"string does not contain bla");
} 
else 
{  
    NSLog(@"string contains bla!");
}

1

ใช้ตัวเลือก NSCaseInsensitiveSearch ด้วย rangeOfString: ตัวเลือก:

NSString *me = @"toBe" ;
NSString *target = @"abcdetobe" ;
NSRange range = [target  rangeOfString: me options: NSCaseInsensitiveSearch];
NSLog(@"found: %@", (range.location != NSNotFound) ? @"Yes" : @"No");
if (range.location != NSNotFound) {
// your code
}

พบผลลัพธ์ผลลัพธ์: ใช่

ตัวเลือกสามารถเป็น "or'ed" ร่วมกันและรวมถึง:

NSCaseInsensitiveSearch NSLiteralSearch NSBackwardsSearch และอีกมากมาย


0

สตริงแรกมีหรือไม่เป็นสตริงที่สอง

NSString *first = @"Banana";
NSString *second = @"BananaMilk";
NSRange range = [first rangeOfString:second options:NSCaseInsensitiveSearch];

if (range.length > 0) {
    NSLog(@"Detected");
}
else {
    NSLog(@"Not detected");
}

0

ลองสิ่งนี้:

Swift 4.1, 4.2:

let stringData = "Black board"

//swift quick way and case sensitive
if stringData.contains("bla") {
    print("data contains string");
}

//case sensitive
if stringData.range(of: "bla",options: .caseInsensitive) != nil {
    print("data contains string");
}else {
    print("data does not contains string");
}

สำหรับ Objective-C:

NSString *stringData = @"Black board";

//Quick way and case sensitive
if ([stringData containsString:@"bla"]) {
    NSLog(@"data contains string");
}

//Case Insensitive
if ([stringData rangeOfString:@"bla" options:NSCaseInsensitiveSearch].location != NSNotFound) {
   NSLog(@"data contains string");
}else {
   NSLog(@"data does not contain string");
}

0

รวดเร็ว 4 ขึ้นไป

let str = "Hello iam midhun"

if str.contains("iam") {
  //contains substring
}
else {
  //doesn't contain substring
}

Objective-C

NSString *stringData = @"Hello iam midhun";

if ([stringData containsString:@"iam"]) {
    //contains substring
}
else {
    //doesn't contain substring
}

-1
-(Bool)checkIf:(String)parentString containsSubstring:(String)checkString {
    NSRange textRange =[parentString rangeOfString:checkString];
    return textRange.location != NSNotFound // returns true if parent string contains substring else returns false
  }

1
ใน Objective-C เรามีประเภท 'NSString` เราไม่มีStringประเภท ประการที่สองเรามีวัตถุทั้งหมด NSStringดังนั้นเป็นอาร์กิวเมนต์คุณควรผ่าน ฉันลงคะแนนสำหรับการลบเนื่องจากคุณภาพของคำตอบไม่ดีภายใต้คำถามที่มีการใช้งานสูง
Aleksey Potapov

-2

หากต้องการตำแหน่งที่แน่นอนของสตริงรหัสนี้จะเกิดขึ้นในSwift 3.0 :

let string = "This is my string"
let substring = "my"

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