Jak mogę sprawdzić, czy ciąg ( NSString
) zawiera inny mniejszy ciąg?
Miałem nadzieję na coś takiego:
NSString *string = @"hello bla bla";
NSLog(@"%d",[string containsSubstring:@"hello"]);
Ale najbliższe, jakie mogłem znaleźć, to:
if ([string rangeOfString:@"hello"] == 0) {
NSLog(@"sub string doesnt exist");
}
else {
NSLog(@"exists");
}
W każdym razie, czy to najlepszy sposób na sprawdzenie, czy ciąg zawiera inny ciąg?
if ([string rangeOfString:@"hello"] == 0) {...}
występuje błąd niedopasowania typu dla NSRange i int. aby to naprawić, należy zmienić wiersz na następujący:if ([string rangeOfString:@"hello"].length == 0) {...}
Odpowiedzi:
Kluczem jest zauważenie, że
rangeOfString:
zwracaNSRange
strukturę, a dokumentacja mówi , że zwraca strukturę,{NSNotFound, 0}
jeśli „stóg siana” nie zawiera „igły”.A jeśli korzystasz z systemu iOS 8 lub OS X Yosemite, możesz teraz: (* UWAGA: spowoduje to awarię aplikacji, jeśli ten kod zostanie wywołany na urządzeniu z systemem iOS7).
(Tak też by to działało w Swift)
👍
źródło
[string rangeOfString:@"bla"].location != NSNotFound
będzie prawdziwe, gdy ciąg znaków jestnil
!W systemie iOS 8.0+ i macOS 10.10+ można używać natywnego narzędzia NSString
containsString:
.W przypadku starszych wersji iOS i macOS możesz utworzyć własną (przestarzałą) kategorię dla NSString:
Uwaga: zwróć uwagę na komentarz Daniela Galasko dotyczący nazewnictwa
źródło
return [self rangeOfString:substring].location != NSNotFound;
i umieściłem w mojej bibliotece refaktoryzacji, es_ios_utils. github.com/peterdeweese/es_ios_utilsPonieważ wydaje się, że jest to wysoki wynik w Google, chcę dodać:
iOS 8 i OS X 10.10 dodają tę
containsString:
metodę doNSString
. Zaktualizowana wersja przykładu Dave'a DeLonga dla tych systemów:źródło
// Możesz również użyć następujących opcji:
źródło
W iOS 8 i Swift możemy użyć
localizedCaseInsensitiveContainsString
metodyźródło
Więc osobiście naprawdę nienawidzę,
NSNotFound
ale rozumiem jego konieczność.Ale niektórzy ludzie mogą nie rozumieć złożoności porównywania z NSNotFound
Na przykład ten kod:
ma swoje problemy:
1) Oczywiście, jeśli
otherString = nil
ten kod ulegnie awarii. prosty test to:prowadzi do !! CRASH !!
2) Dla kogoś nowego w celu-c nie jest to tak oczywiste, że ten sam kod NIE ulega awarii, gdy
string = nil
. Na przykład ten kod:i ten kod:
spowoduje oba
Które wyraźnie NIE jest tym, czego chcesz.
Lepszym rozwiązaniem, które moim zdaniem działa, jest wykorzystanie faktu, że rangeOfString zwraca długość 0, więc lepszym, bardziej niezawodnym kodem jest:
LUB PO PROSTU:
które w przypadku 1 i 2 powrócą
To moje 2 centy ;-)
Proszę sprawdzić moją Gist, aby uzyskać bardziej pomocny kod.
źródło
Ulepszona wersja P i jest rozwiązaniem , kategoria na NSString, który nie tylko pokaże, jeśli ciąg znajduje się wewnątrz innego łańcucha, ale również wykonuje szereg odnośnik, to:
Użyj tego jak:
źródło
Oto fragment funkcji kopiuj i wklej:
źródło
Oneliner (mniejsza ilość kodu. OSUSZANIE, ponieważ masz tylko jeden
NSLog
):źródło
źródło
Spróbuj tego,
źródło
Najlepsze rozwiązanie Tak proste jak to! Jeśli chcesz znaleźć słowo lub część ciągu. Możesz użyć tego kodu. W tym przykładzie sprawdzimy, czy wartość słowa zawiera „aktor”.
źródło
W Swift 4:
źródło
Jeśli potrzebujesz tego raz, napisz:
źródło
W przypadku szybkiego można tego użyć
źródło
Jeśli nie zawracaj sobie głowy rozróżnianiem wielkości liter. Spróbuj tego raz.
źródło
Proszę użyć tego kodu
źródło
Użyj opcji NSCaseInsensitiveSearch z rangeOfString: opcje:
Znaleziono wynik wyjściowy: Tak
Opcje mogą być „lub” połączone i obejmują:
NSCaseInsensitiveSearch NSLiteralSearch NSBackwardsSearch i więcej
źródło
Pierwszy ciąg zawiera lub nie drugi ciąg,
źródło
Spróbuj tego:
Swift 4.1, 4.2:
Dla celu C:
źródło
Swift 4 i wyżej
Cel C
źródło
źródło
String
typu. Po drugie, mamy wszystkie przedmioty. Jako argument powinieneś przekazaćNSString
. Głosuję za skreśleniem z powodu złej jakości odpowiedzi w ramach bardzo aktywnego pytania.Jeśli potrzebna jest określona pozycja ciągu, ten kod pojawia się w Swift 3.0 :
źródło