วิธีตรวจสอบว่า NSString เริ่มต้นด้วยอักขระบางตัว


210

คุณจะตรวจสอบว่า NSString เริ่มต้นด้วยอักขระบางตัวได้อย่างไร (ตัวอักษร *)

The * เป็นตัวบ่งชี้สำหรับชนิดของเซลล์ดังนั้นฉันต้องการเนื้อหาของ NSString นี้โดยไม่มี * แต่ต้องรู้ว่ามี * อยู่หรือไม่

คำตอบ:


453

คุณสามารถใช้-hasPrefix:วิธีการNSString:

Objective-C:

NSString* output = nil;
if([string hasPrefix:@"*"]) {
    output = [string substringFromIndex:1];
}

สวิฟท์:

var output:String?
if string.hasPrefix("*") {
    output = string.substringFromIndex(string.startIndex.advancedBy(1))
}

มีวิธีใช้วิธีเดียวกันนี้ แต่แทนที่จะเป็นhasPrefix:@"word"คุณตรวจสอบหลายค่าที่เก็บไว้ในNSArray? ตัวอย่างเช่น: NSArray *words = [NSArray arrayWithObjects:@"foo",@"bar",@"baz",nil];?
adamdehaven

^^ ดูคำถามของฉันที่นี่: stackoverflow.com/questions/18019660/…
adamdehaven

คำตอบที่ดี! ขอบคุณ @Rob Keniger
Ganesh Guturi

1
CFStringHasPrefix () สามารถใช้กับ NSStrings ได้เนื่องจาก "Bridging Toll Free" ประสิทธิภาพของ CFStringHasPrefix () น่าจะดีขึ้น 2-3 เท่า (อย่างน้อยเมื่อใช้ชุดข้อมูลของฉัน) ดังนั้นหากคุณใช้งานในพื้นที่อ่อนไหวด้านประสิทธิภาพคุณอาจต้องการลอง CFStringHasPrefix () แทน
John Bowers

12

คุณสามารถใช้ได้:

NSString *newString;
if ( [[myString characterAtIndex:0] isEqualToString:@"*"] ) {
     newString = [myString substringFromIndex:1];
}

3
คุณไม่สามารถส่งข้อความไปยัง unichars และพวกเขาอาจจะไม่เท่ากับ NSStrings
Chuck

8

hasPrefixทำงานได้ดีเป็นพิเศษ ตัวอย่างเช่นหากคุณกำลังมองหา http URL ใน a NSStringคุณจะต้องใช้componentsSeparatedByStringในการสร้างNSArrayและย้ำอาร์เรย์ที่ใช้hasPrefixในการค้นหาองค์ประกอบที่เริ่มต้นด้วย http

NSArray *allStringsArray = 
   [myStringThatHasHttpUrls componentsSeparatedByString:@" "]

for (id myArrayElement in allStringsArray) {
    NSString *theString = [myArrayElement description];
    if ([theString hasPrefix:@"http"]) {
        NSLog(@"The URL  is %@", [myArrayElement description]);
    }

}

hasPrefix ส่งคืนค่าบูลีนที่ระบุว่าสตริงที่กำหนดตรงกับอักขระเริ่มต้นของผู้รับ

- (BOOL)hasPrefix:(NSString *)aString, 

พารามิเตอร์aStringเป็นสตริงที่คุณกำลังมองหาค่าตอบแทนเป็นใช่ถ้า aString ตรงกับตัวอักษรเริ่มต้นของผู้รับมิฉะนั้น NO ส่งคืนไม่ใช่ถ้าaStringว่างเปล่า



4
NSString *stringWithoutAsterisk(NSString *string) {
    NSRange asterisk = [string rangeOfString:@"*"];
    return asterisk.location == 0 ? [string substringFromIndex:1] : string;
}

4

อีกวิธีในการทำ ..

ขอให้ช่วยใครสักคน ...

if ([[temp substringToIndex:4] isEqualToString:@"http"]) {
  //starts with http
}

3

เป็นคำตอบทั่วไปเพิ่มเติมลองใช้วิธี hasPrefix ตัวอย่างเช่นรหัสด้านล่างตรวจสอบเพื่อดูว่าสตริงเริ่มต้นด้วย 10 ซึ่งเป็นรหัสข้อผิดพลาดที่ใช้ในการระบุปัญหาบางอย่าง

NSString* myString = @"10:Username taken";

if([myString hasPrefix:@"10"]) {
      //display more elegant error message
}


0

รหัสเล็กน้อยดีนี้ฉันพบโดยบังเอิญและฉันยังไม่เห็นมันแนะนำใน Stack ใช้งานได้เฉพาะเมื่อมีอักขระที่คุณต้องการลบหรือแก้ไขซึ่งมีความสะดวกในหลาย ๆ สถานการณ์ หากตัวละคร / s ไม่มีอยู่มันจะไม่เปลี่ยน NSString ของคุณ:

NSString = [yourString stringByReplacingOccurrencesOfString:@"YOUR CHARACTERS YOU WANT TO REMOVE" withString:@"CAN either be EMPTY or WITH TEXT REPLACEMENT"];

นี่คือวิธีที่ฉันใช้:

//declare what to look for
NSString * suffixTorRemove = @"</p>";
NSString * prefixToRemove = @"<p>";
NSString * randomCharacter = @"</strong>";
NSString * moreRandom = @"<strong>";
NSString * makeAndSign = @"&";

//I AM INSERTING A VALUE FROM A DATABASE AND HAVE ASSIGNED IT TO returnStr
returnStr = [returnStr stringByReplacingOccurrencesOfString:suffixTorRemove withString:@""];
returnStr = [returnStr stringByReplacingOccurrencesOfString:prefixToRemove withString:@""];
returnStr = [returnStr stringByReplacingOccurrencesOfString:randomCharacter withString:@""];
returnStr = [returnStr stringByReplacingOccurrencesOfString:moreRandom withString:@""];
returnStr = [returnStr stringByReplacingOccurrencesOfString:makeAndSign withString:@"&"];

//check the output
NSLog(@"returnStr IS NOW: %@", returnStr);

หนึ่งบรรทัดนี้ง่ายต่อการดำเนินการสามอย่างในหนึ่งเดียว:

  1. ตรวจสอบสตริงของคุณสำหรับอักขระที่คุณไม่ต้องการ
  2. สามารถแทนที่พวกเขาด้วยสิ่งที่คุณต้องการ
  3. ไม่ส่งผลกระทบต่อโค้ดที่ล้อมรอบ

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