Cách kiểm tra nếu NSString bắt đầu bằng một ký tự nhất định


210

Làm thế nào để bạn kiểm tra nếu một NSString bắt đầu bằng một ký tự nhất định (ký tự *).

* Là một chỉ báo cho loại ô, vì vậy tôi cần nội dung của NSString này mà không có dấu *, nhưng cần biết liệu * có tồn tại không.

Câu trả lời:


453

Bạn có thể sử dụng -hasPrefix:phương pháp NSString:

Mục tiêu-C:

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

Nhanh:

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

Có cách nào để sử dụng cùng một phương thức này không, nhưng thay vì hasPrefix:@"word"bạn kiểm tra nhiều giá trị được lưu trữ trong một NSArray? Ví dụ : NSArray *words = [NSArray arrayWithObjects:@"foo",@"bar",@"baz",nil];?
adamdehaven

^^ Xem câu hỏi của tôi ở đây: stackoverflow.com/questions/18019660/ từ
adamdehaven

Câu trả lời tốt đẹp! Cảm ơn bạn @Rob Keniger
Ganesh Guturi

1
CFStringHasPrefix () cũng có thể được sử dụng trên NSStrings do "Toll Free Bridging". Hiệu suất của CFStringHasPrefix () dường như tốt hơn 2-3 lần (ít nhất là khi sử dụng bộ dữ liệu của tôi). Vì vậy, nếu bạn đang sử dụng nó trong một khu vực nhạy cảm về hiệu suất, bạn có thể muốn thử CFStringHasPrefix ().
John Bowers

12

Bạn có thể dùng:

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

3
Bạn không thể gửi tin nhắn đến unichars và chúng có thể sẽ không bằng NSStrings.
Chuck

8

hasPrefix hoạt động đặc biệt tốt. ví dụ: nếu bạn đang tìm kiếm một url http trong một NSString, bạn sẽ sử dụng componentsSeparatedByStringđể tạo NSArrayvà lặp lại mảng bằng cách sử dụng hasPrefixđể tìm các phần tử bắt đầu bằng 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 trả về giá trị Boolean cho biết liệu một chuỗi đã cho có khớp với các ký tự đầu của người nhận hay không.

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

tham số aStringlà một chuỗi mà bạn đang tìm Giá trị trả về là CÓ nếu aString khớp với các ký tự đầu của người nhận, nếu không thì KHÔNG. Trả về KHÔNG nếu aStringtrống.



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

4

Một cách tiếp cận khác để làm điều đó ..

Nó có thể giúp ai đó ...

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

3

Để trả lời tổng quát hơn, hãy thử sử dụng phương thức hasPrefix. Ví dụ, mã bên dưới kiểm tra xem một chuỗi bắt đầu bằng 10, đây là mã lỗi được sử dụng để xác định một vấn đề nhất định.

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

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


0

Một chút mã đẹp này tôi tình cờ tìm thấy và tôi vẫn chưa thấy nó được đề xuất trên Stack. Nó chỉ hoạt động nếu các ký tự bạn muốn loại bỏ hoặc thay đổi tồn tại, thuận tiện trong nhiều tình huống. Nếu ký tự không tồn tại, nó sẽ không thay đổi NSString của bạn:

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

Đây là cách tôi sử dụng nó:

//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);

Dòng này cực dễ để thực hiện ba hành động trong một:

  1. Kiểm tra chuỗi của bạn cho các ký tự mà bạn không muốn
  2. Có thể thay thế chúng bằng bất cứ điều gì bạn thích
  3. Không ảnh hưởng đến mã xung quanh

0
NSString* expectedString = nil;
if([givenString hasPrefix:@"*"])
{
   expectedString = [givenString substringFromIndex:1];
}
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.