Jak sprawdzić, czy NSString zaczyna się od określonej postaci


210

Jak sprawdzasz, czy NSString zaczyna się od określonej postaci (znaku *).

* Jest wskaźnikiem typu komórki, więc potrzebuję zawartości tego NSString bez *, ale muszę wiedzieć, czy * istnieje.

Odpowiedzi:


453

Możesz użyć -hasPrefix:metody NSString:

Cel C:

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

Szybki:

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

Czy istnieje sposób na użycie tej samej metody, ale zamiast tego hasPrefix:@"word"sprawdzasz, czy istnieje wiele wartości przechowywanych w pliku NSArray? Na przykład NSArray *words = [NSArray arrayWithObjects:@"foo",@"bar",@"baz",nil];:?
adamdehaven


Niezła odpowiedź! Dziękuję @Rob Keniger
Ganesh Guturi

1
CFStringHasPrefix () może być również używany w NSStrings ze względu na „Toll Free Bridging”. Wydajność CFStringHasPrefix () wydaje się 2-3 razy lepsza (przynajmniej przy użyciu mojego zestawu danych). Więc jeśli używasz go w obszarze wrażliwym na wydajność, możesz zamiast tego spróbować CFStringHasPrefix ().
John Bowers

12

Możesz użyć:

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

3
Nie możesz wysyłać wiadomości do unichars i prawdopodobnie nie będą one równe NSStrings.
Chuck

8

hasPrefix działa szczególnie dobrze. na przykład, jeśli szukałeś http URL w NSString, należałoby użyć componentsSeparatedByString, aby utworzyć NSArrayi iterate tablica użyciu hasPrefixznaleźć elementy, które zaczynają się od 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 zwraca wartość logiczną wskazującą, czy dany ciąg pasuje do początkowych znaków odbiornika.

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

parametr aStringto ciąg, którego szukasz Zwracana wartość to TAK, jeśli ciąg znaków pasuje do początkowych znaków odbiornika, w przeciwnym razie NIE. Zwraca NIE, jeśli aStringjest pusty.



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

4

Inne podejście do tego…

Niech może komuś pomóc ...

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

3

Jako ogólniejszą odpowiedź spróbuj użyć metody hasPrefix. Na przykład poniższy kod sprawdza, czy ciąg zaczyna się od 10, który jest kodem błędu używanym do identyfikowania określonego problemu.

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

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


0

Ten miły kawałek kodu znalazłem przypadkiem i jeszcze go nie widziałem na Stackie. Działa tylko wtedy, gdy istnieją postacie, które chcesz usunąć lub zmienić, co jest wygodne w wielu scenariuszach. Jeśli znak / znaki nie istnieją, nie zmieni twojego NSString:

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

Tak to wykorzystuję:

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

Ta jedna linia jest bardzo łatwa do wykonania trzech czynności w jednym:

  1. Sprawdza, czy w ciągu nie ma znaków, których nie chcesz
  2. Można je zastąpić czymkolwiek chcesz
  3. Nie wpływa na otaczający kod

0
NSString* expectedString = nil;
if([givenString hasPrefix:@"*"])
{
   expectedString = [givenString substringFromIndex:1];
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.